求助,看了好久还是WA了

B3843 [GESP202306 三级] 密码合规

S_Kuroko @ 2023-10-04 10:27:47

#include<bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    cin>>s;
    bool flag1=0,flag2=0,flag3=0,flag=0;
    int end=0;
    for(int i=0;i<=s.size();i++)
    {
        if(s[i]==','||i==s.size())
        {
            if(flag1+flag2+flag3>=2&&flag==1&&i-end>=6&&i-end<=12)
            {
                for(int j=end;j<=i-1;j++)
                {
                    cout<<s[j];
                }
                cout<<endl;
                end=i+1;
                flag1=0,flag2=0,flag3=0,flag=0;
            }
        }
        else if(s[i]>='a'&&s[i]<='z')
        {
            flag2=1;
        }
        else if(s[i]>='A'&&s[i]<='Z')
        {
            flag1=1;
        }
        else if(s[i]>='0'&&s[i]<='9')
        {
            flag3=1;
        }
        else if(s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$')
        {
            flag=1;
        }
        else
        {
            flag1=0,flag2=0,flag3=0,flag=0;
            continue;
        }
    }

    return 0;
}

by Mr_Mu @ 2023-11-27 20:13:27

看这个样例:

A8CM,Kfw0h,6OQf,$rMjziuP6b$%,p9b#,0qopAGf@oQlduEl,9x%,!OvzWq7PXKYhYu,hxyd,X4y40leS!

正确输出应该是:

X4y40leS!

而你的代码没有输出。

或者再看离谱一点的样例:

,a1b2c!

正确输出应该是:

a1b2c!

而你的代码是:

,a1b2c!

:(

你的大概思路是如果读取到 ',' 或到最后一个字符时,视为一串密码进行判断。否则就对当前还未结束的密码的字符进行判断。

但!你的判断思路有问题

再看一个样例:

   ^&*Ab!

有特殊字符 '^','&','*',本不该输出,但你的代码输出了!

因为你的 25~45行有一个缺陷,只要特殊字符不在末尾并且后面的字符能符合密码要求,你的代码就会再次将 flag (1,2,3) 设为真,然后不合规的密码就会被输出!

其他样例就可以顺藤摸瓜思考一下啦~


by S_Kuroko @ 2024-03-13 19:10:18

@Mr_Mu 感谢大佬!最近看洛谷比较少,所以没来得及回


by Mr_Mu @ 2024-08-20 14:37:35

@S_Kuroko 我也好久没上了...


|