問題描述
小藍正在開發自己的 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;
}