思路
这道题非常的巧妙,我先拿数字举例:
总共有10种数字,除去自己以外有9种
if(整个密码里只有一个数字){
那么非常显然啊,这个数字只能变成另一种数字,总方案数只能+9(对应代码里的<1>)
}
else{
有一个和上述一样,为了保证密码里有数字,只能变换成数字,那其他的数字就可以别的任意种字符了,总共有(10+26+26+4-1=65种),总共有n(n>=2)个数字即可有n-1个这种变换为别的字符的(对应代码的<2>)
}
综上
综上,只需要统计出数字,小写字母,大写字母,字符去除1后的总数量再乘65即可
#include <bits/stdc++.h>
using namespace std;
#define sc second
#define fr first
#define int long long
int n, m, num, cnt = 0, l = 1, r = 1e10;
string s;
void solve()
{
cin >> s;
int ans = 0;
int a1 = 0, a2 = 0, a3 = 0, a4 = 0;
for (int i = 0; i < s.size(); i++)
{ // 数字,小写字母,大写字母,字符分别有几个
if ('0' <= s[i] && s[i] <= '9')
{
a1++;
}
if ('a' <= s[i] && s[i] <= 'z')
{
a2++;
}
if ('A' <= s[i] && s[i] <= 'Z')
{
a3++;
}
if (s[i] == ',' || s[i] == '.' || s[i] == '?' || s[i] == '!')
{
a4++;
}
}
if (a1 == 1)
{
ans += 9; //<1>
a1--; //<2>
}
if (a2 == 1)
{
ans += 25;
a2--;
}
if (a3 == 1)
{
ans += 25;
a3--;
}
if (a4 == 1)
{
ans += 3;
a4--;
}
ans += (a1 + a2 + a3 + a4) * 65;
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int awa = 1;
cin >> awa; // 测试组数
while (awa--)
{
solve();
}
return 0;
}

京公网安备 11010502036488号