1 条题解

  • 0
    @ 2025-8-24 23:02:24

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 封禁用户
    None

    搬运于2025-08-24 23:02:24,当前版本为作者最后更新于2024-08-24 15:30:42,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P10906[蓝桥杯 2024 国B] 合法密码

    题目链接:P10906


    题目大意

    在给定的字符串中寻找符合要求的字符串,这些字符串需要满足以下两个要求:

    • 长度大于等于 88 个字符,小于等于 1616 个字符。
    • 必须包含至少 11 个数字字符和至少 11 个符号字符。

    样例分析

    本题提交答案即可,即把正确的答案提交上去即可,不需要提交代码。


    思路构建

    很明显,一个由 100100 个字符组成的字符串想要一一枚举出来极其不现实,既容易多数漏数也容易重复数,因此还是需要编写一个代码来实现。
    这个代码其实很简单,从字符串第一个数开始,这个数保持不变,然后找出所有长度为 88~1616 之间的所有字符串(这里就是满足第一个条件),接着看这些字符串是否满足第二个条件,如果满足ans++,不满足则不加。
    重复上面这个步骤直到还剩77个字符时停止。


    代码展示

    本题答案为 400400,直接输出这个数即可。

    这里给出部分代码,仅供参考。

    void solve()
    {
        string s;
        cin >> s;
        int n = s.size();
        auto check = [&](string t) -> bool
        {
            bool fl = 0;
            for(auto c : t)
                if(isdigit(c))
                    fl = 1;
            if(!fl) return false;
            for(auto c : t)
            {
                if(isdigit(c) || isalpha(c)) continue;
                return true;
            }
            return false;
        };
        int cnt = 0;
        for(int i = 0; i < n; i ++)
        {
            for(int len = 8; len <= 16; len ++)
            {
                if(i + len - 1 >= n) break;
                int l = i, r = i + len - 1;
                string s1 = s.substr(i, len);
                if(check(s1))
                    cnt ++;
            }
        }
        cout << cnt << endl;
    }
    

    完结撒花

    感谢您看到这里,如果您觉得有帮助麻烦您点个赞谢谢~

    • 1

    信息

    ID
    10667
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者