随机密码生成器

苏苏在上网某某和谐网站的时候,突然弹出一个窗口,上面写着:

CSDN, Adobe 等网站的用户数据库都被人拖走啦,你还敢在多个网站使用同一个密码吗?快来使用我们的随机密码生成器吧!

于是苏苏来到了一个奇怪的网站,上面有一个巨黑的输入框,下面还写着一些小字:

这是一个随机密码生成器,请在上方输入命令。

聪明的苏苏很快就推断出了这个生成器是如何工作的:

  • 这个系统可以根据你的模板字符串生成相应格式的随机密码;
  • 模板字符串是由若干条格式字符串连接而成,一个格式字符串是由一个字符加上一个正整数来表示的;
  • 格式字符串一共有三种类型。字符 'A' 表示大写字母,字符 'a' 表示小写字母,字符 '.'(一个英文句点)表示特殊符号;
  • 每种类型的格式只会被描述一次,即不存在 "A5A10" 这种模板字符串。
  • 例如,"A5" 表示 5 个大写字母,"a12.2" 表示 12 个小写字母以及 2 个特殊符号,要注意随机密码中各个字符的位置和格式字符串的位置无关。

另外,特殊符号由以下字符组成:

!@#$\%^&*()_-<>,./?

苏苏想要验证一下网站生成的密码是否符合相应的规则,他决定把这个验证程序交给你来写。

输入格式

一个整数 T,表示有多少组测试数据。

对于每组测试数据,首先给出一行长度不超过 100 的非空字符串 S,表示一个合法的模板字符串。

接下来的一行,给出一个整数 N (1 <= N <= 20),表示生成的密码数量。然后的 N 行,每行给出一个长度在 0 到 200 之间的字符串 Ai,表示生成的密码。字符串中的所有字符的 ASCII 值均在 32 到 126 之间。

输出格式

对于每组测试数据的每条密码,如果该密码是一个符合规则的随机密码,则输出 "Yes",否则输出 "No",注意输出的内容不含引号。

样例输入

2
a2
2
ab
nokia
a2A2
3
AaBb
aaaB
AAAAbbbb

样例输出

Yes
No
Yes
No

No

case都能过,不知道提交后为嘛是Output Limit Exceeded

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

int main(){
	//freopen("G:\\input.in", "r", stdin);
	int t, n, pos1, pos2, pos3;
	string s, s1;
	string sp = "!@#$\\%^&*()_-<>,./?";
	cin >> t;
	while (t--){
		cin >> s >> n;
		pos1 = s.find('A');
		pos2 = s.find('a');
		pos3 = s.find('.');
		int cnt1 = 0, cnt2 = 0, cnt3 = 0;
		if (pos1 != string::npos){
			for (int i = pos1 + 1; i < s.size(); i++){
				if (s[i] >= '0' && s[i] <= '9'){
					cnt1 = cnt1 * 10 + s[i] - '0';
				}
				else
					break;
			}
		}
		if (pos2 != string::npos){
			for (int i = pos2 + 1; i < s.size(); i++){
				if (s[i] >= '0' && s[i] <= '9'){
					cnt2 = cnt2 * 10 + s[i] - '0';
				}
				else
					break;
			}
		}
		if (pos3 != string::npos){
			for (int i = pos3 + 1; i < s.size(); i++){
				if (s[i] >= '0' && s[i] <= '9'){
					cnt3 = cnt3 * 10 + s[i] - '0';
				}
				else
					break;
			}
		}
		while (n--){
			cin >> s1;
			int k1 = 0, k2 = 0, k3 = 0;
			for (int i = 0; i < s1.size(); i++){
				if (s1[i] >= 'A' && s1[i] <= 'Z')
					k1++;
				else if (s1[i] >= 'a' && s1[i] <= 'z')
					k2++;
				else if (sp.find(s1[i]) != string::npos)
					k3++;
			}
			if ((s1.size()>200) || (k1 + k2 + k3 != s1.size()) || (k1 != cnt1) || (k2 != cnt2) || (k3 != cnt3)){
				printf("No\n");
			}
			else
				printf("Yes\n");
		}
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值