蓝桥杯15届国赛 合法密码
问题描述
小蓝正在开发自己的 OJ 网站。他要求网站用户的密码必须符合以下条件:
- 长度大于等于 8 个字符,小于等于 16 个字符。
- 必须包含至少 1 个数字字符和至少 1 个符号字符。
例如 **lanqiao2024!
、+-*/0601
、8((>w<))8**
都是合法的密码。 而 **12345678
、##\*\*##\*\*
、abc0!#
、lanqiao20240601!?**
都不是合法的密码。
请你计算以下的字符串中,有多少个子串可以当作合法密码?只要两个子串的开头字符和末尾字符在原串中的位置不同,就算作不同的子串。
字符串为:
kfdhtshmrw4nxg#f44ehlbn33ccto#mwfn2waebry#3qd1ubwyhcyuavuajb#vyecsycuzsmwp31ipzah#catatja3kaqbcss2th
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分
遍历所有可能的密码,选出合法的
#include<iostream>
using namespace std;typedef long long ll;string s =
"kfdhtshmrw4nxg#f44ehlbn33ccto#mwfn2waebry#3qd1ubwyhcyuavuajb#vyecsycuzsmwp31ipzah#catatja3kaqbcss2th";ll ans;int main()
{for(ll i=0; i<=s.size()-8; ++i){for(ll j=8; j<=16&&j<=s.size()-i; ++j) //s.size()-i表示从位置i开始剩余的字符数//子串不能超出字符串的剩余部分,否则s.substr(i, j)会越界{string s1=s.substr(i, j); //提取从位置i开始的j个字符 ll len = s1.size();ll a=0, b=0, c=0;for(ll k=0; k<len; ++k){//如果有数字 if(s1[k]>='0'&&s1[k]<='9') a=1;//如果有字母 else if(s1[k]>='a'&&s1[k]<='z') b=1;//如果有特殊符号 else c=1; //这种写法很好,排除数字字母即为特殊符号 } if(a==1 && c==1) ans++;}}cout<<ans;return 0;
}