洛谷B3843 [GESP202306 三级] 密码合规

(洛谷ID:vonNeumann)

解题思路


采用扫描法

  1. 遇到逗号跳过,记录逗号后的位置(begin)
  2. 跳过非逗号字符串(密码本身)
  3. 记录字符串结尾位置(end)
  4. 用string变量函数substr截取密码(begin~end),如果长度超过12 或者 低于6,跳过此密码
  5. 扫描密码。如果出现非法字符,跳过此密码;如果四大字符出现一个,将bool(flag)变量标true;如果出现大写字母,小写字母,数字,则将bool数组对应的一项标ture
  6. 扫描bool数组(不是变量),遇到一项ture,sum(记录true次数的整型变量)+1
  7. 如果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;
 } 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值