思路

这道题非常的巧妙,我先拿数字举例:

总共有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;
}