(洛谷ID:vonNeumann)
解题思路
采用扫描法
- 遇到逗号跳过,记录逗号后的位置(begin)
- 跳过非逗号字符串(密码本身)
- 记录字符串结尾位置(end)
- 用string变量函数substr截取密码(begin~end),如果长度超过12 或者 低于6,跳过此密码
- 扫描密码。如果出现非法字符,跳过此密码;如果四大字符出现一个,将bool(flag)变量标true;如果出现大写字母,小写字母,数字,则将bool数组对应的一项标ture
- 扫描bool数组(不是变量),遇到一项ture,sum(记录true次数的整型变量)+1
- 如果flag为true,并且sum>=2,输出该密码
代码见下
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
bool zf[5];
int main()
{
string x;
cin>>x;
int pos=0;
int c=x.length();
while (pos<c)
{
for (int i=0;i<3;i++)
zf[i]=false;
while (pos<c && x[pos]==',')
pos++;
int begin=pos;
if (pos>c)
break;
while (pos<c && x[pos]!=',')
pos++;
if (pos>c)
break;
int end=pos;
string key=x.substr(begin,end-begin);
int len=key.length();
if (len>=6 && len<=12)
{
bool flag=false;
bool qj=false;
for (int i=0;i<len;i++)
{
if (key[i]=='!' || key[i]=='@' || key[i]=='#' || key[i]=='$')
flag=true;
else if (key[i]>='a' && key[i]<='z')
zf[0]=true;
else if (key[i]>='A' && key[i]<='Z')
zf[1]=true;
else if (key[i]>='0' && key[i]<='9')
zf[2]=true;
else
{
qj=true;
break;
}
}
if (qj)
continue;
int sum=0;
for (int i=0;i<3;i++)
{
if (zf[i])
sum++;
}
if (sum>=2 && flag)
cout<<key<<'\n';
}
}
return 0;
}