CCCPaste

Вася и пароль

В этой задаче достаточно было рассмотреть несколько случаев.

1) Если пароль 𝑠
изначально корректен, то ничего менять не нужно — просто выводим 𝑠.
2) Теперь попробуем изменить один символ, для этого переберем его и переберем три варианта его замены(любая цифра, любая заглавная латинская буква и любая строчная латинская буква). После замены проверим строку на корректность и если нашлась корректная строка — выведем её.
3) У нас не получилось заменить подстроку длины 0 и 1, а значит ответ минимум 2. Мы можем всегда его получить следующим образом: заменим первых два символа на «a1», если третий символ заглавная латинская буква, на «A1», если третий символ строчная латинская буква и на «aA», если третий символ — цифра.

#include <bits/stdc++.h>

using namespace std;

string s;

bool ok(string t){
int msk = 0;

for(int i = 0; i < int(t.size()); ++i){
if(isupper(t[i])) msk |= 1;
if(islower(t[i])) msk |= 2;
if(isdigit(t[i])) msk |= 4;
}

return msk == 7;
}

int main() {
//freopen("input.txt", "r", stdin);
int t;
cin >> t;
for(int i = 0; i < t; ++i){
cin >> s;
if(ok(s)){
cout << s << endl;
continue;
}
bool fnd = false;
for(int i = 0; i < int(s.size()); ++i){
string t = s;

t[i] = '1';
if(ok(t)){
cout << t << endl;
fnd = true;
break;
}
t[i] = 'a';
if(ok(t)){
cout << t << endl;
fnd = true;
break;
}
t[i] = 'A';
if(ok(t)){
cout << t << endl;
fnd = true;
break;
}
}

if(fnd) continue;

if(isupper(s[2])){
s[0] = 'a';
s[1] = '1';
cout << s << endl;
continue;
}
if(islower(s[2])){
s[0] = 'A';
s[1] = '1';
cout << s << endl;
continue;
}
if(isdigit(s[2])){
s[0] = 'a';
s[1] = 'A';
cout << s << endl;
continue;
}
}
return 0;
}