题解 | #I 智乃的密码#

智乃的密码

https://ac.nowcoder.com/acm/contest/23478/I

2022牛客寒假算法基础集训营3——I 智乃的密码

原题链接

思路(双指针)

  • ii: 枚举密码的左边界
  • j1j-1: 表示第一个满足条件3(包含至少三种字符)的右边界
  • i,j,l=max(j1,i+L1),r=min(n1,i+R1)对每个i,j, 合法左边界l = max(j - 1, i + L - 1), 合法右边界r = min(n - 1, i + R - 1)
  • 算法的正确性:对于每个ii, 当i+1i+1时, jj的位置只能增加不能减少, 因为j1j-1是第一个满足条件的右边界, i+1i+1, 字符减少了11个, 要么仍然符合条件(jj不变),要么不符合条件(jj增加)

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, -1, 1};
const double eps = 1e-6;
const int N = 1e5 + 10;
int n, L, R;
int cnt[4];
int type[N];

// 是否至少包括三类字符
bool check()
{
    return ((cnt[0] > 0) + (cnt[1] > 0) + (cnt[2] > 0) + (cnt[3] > 0)) >= 3;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> L >> R;
    string s;
    cin >> s;
    for (int i = 0; i < n; i++)
    {
        if (isdigit(s[i]))
            type[i] = 0;
        else if (islower(s[i]))
            type[i] = 1;
        else if (isupper(s[i]))
            type[i] = 2;
        else
            type[i] = 3;
    }

    LL ans = 0;
    for (int i = 0, j = 0; i < n; i ++)
    {
        // while循环得到j: 第一个满足条件的(右边界+1)
        while (j <= n && !check())
        {
            // 先把s[j]的类型记录, 再j++. 这是因为s[0]的类型也要算到cnt数组内, 先j++的话, s[0]的类型没有记录
            if (j < n) // j == n时s[j]不存在, type[j]无意义
                cnt[type[j]]++;
            j++;
        }

        int r = min(n - 1, i + R - 1); // 右边界
        int l = max(j - 1, i + L - 1); // 左边界
        if (j <= n && check())
        {
            ans += max(0,  r - l + 1);
        }
        cnt[type[i]]--;
    }
    cout << ans << '\n';

    return 0;
}
全部评论
老哥这个// while循环得到j: 第一个满足条件的(右边界+1) 这句话是什么意思呢, ``` while (j < n && !check()) ``` 这为啥会错
点赞 回复 分享
发布于 2022-06-30 17:56

相关推荐

时间线:&nbsp;1.4-1.5:&nbsp;boss&nbsp;牛客&nbsp;官网&nbsp;实习僧海投了两天,&nbsp;感觉确实没啥招人的啊,&nbsp;心里凉了一半.1.6:&nbsp;中午快手约面,&nbsp;下午字节hr飞书私聊约面,&nbsp;当时想着第一次面大厂感觉三个过一个一面就已经赢了.1.7:&nbsp;下午&nbsp;3点大厂处女面,&nbsp;哈哈面试官是重邮红岩的直接保送;&nbsp;5点快手一面,&nbsp;我说这个是我的第二次大厂面试,&nbsp;面试官问要是拿到字节和快手选择哪个,&nbsp;我说昨天看了一晚上快手百分百选快手哈哈哈.&nbsp;晚上5.30字节约二面,&nbsp;快手约二面,&nbsp;小红书约一面.1.8:&nbsp;下午2点快手二面,&nbsp;聊天面体验非常好(当天电话确认入职时间);&nbsp;4点字节二面这次不是校友了,&nbsp;然后有一个CSS实现switch效果的忘记属性咋写了,&nbsp;感觉危了;&nbsp;7.30&nbsp;问字节hr是不是挂了;&nbsp;9点开始小红书一面,&nbsp;难死我了,&nbsp;但我还是笑着面完了,&nbsp;然后卸载了小红书,&nbsp;但是过了一会会小红书hr约二面,&nbsp;遂下回来了字节约三面.1.9:&nbsp;下午2点字节三面,&nbsp;依旧聊天+算法,&nbsp;自己太菜了有一个写错了,&nbsp;面完感觉又危了;&nbsp;5点面小红书20min结束(offer审批);5.30又去问字节hr是不是挂了,&nbsp;hr小姐姐说干嘛用一个句式,&nbsp;我说手写题又又又没写出来😂,&nbsp;2min后约hr面;8.30&nbsp;快手offer总结,&nbsp;自己运气好遇到了好公司好部门好面试官,&nbsp;字节剪映&nbsp;快手电商&nbsp;小红书支付的面试体验都非常好,&nbsp;不会的题会带你一步一步思考,&nbsp;流程也非常快全部都是当天推进,&nbsp;小红书是以分钟为单位推进.&nbsp;&nbsp;面经以及细节等我慢慢整理,&nbsp;&nbsp;以及保佑所有的审批不要出问题,&nbsp;我是真怕最后全过了0offer😂bg:&nbsp;重邮&nbsp;大数据&nbsp;蓝山工作室&nbsp;一段非大厂实习
独角仙梦境:这是真👻了
找实习记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务