// https://prologin.org/train/2022/qualification/fuite_de_clavier #include #include using namespace std; int main() { int n = 0, k = 0; // taille de la chaîne, taille du mot de passe string s; // chaîne récupérée par le keylogger cin >> n >> k >> s; string uppers, lowers, digits; for(int k = 0; k < 26; k++) { uppers += 'A' + k; // majuscules lowers += 'a' + k; // minuscules } for(int k = 0; k < 10; k++) digits += '0' + k; // chiffres string specials = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"; // spéciaux int cnt = 0; for(int i = 0; i <= n - k; i++) { string t = s.substr(i, k); // pour chaque sous-chaîne de longueur k bool up = false, lo = false, di = false, sp = false; // Upper letters for(auto &c: uppers) { //if(t.contains(c)) if(t.find(c) != string::npos) { up = true; // il y a une majuscule break; } } // Lower letters for(auto &c: lowers) { //if(t.contains(c)) if(t.find(c) != string::npos) { lo = true; // il y a une minuscule break; } } // Digits for(auto &c: digits) { //if(t.contains(c)) if(t.find(c) != string::npos) { di = true; // il y a un chiffre break; } } // Special characters for(auto &c: specials) { //if(t.contains(c)) if(t.find(c) != string::npos) { sp = true; // il y a un caractère spécial break; } } bool valide = up && lo && di && sp; if(valide == false) continue; else cnt++; // les 4 conditions sont vérifiées } cout << cnt << '\n'; return 0; } // main()