Official
C - Secret Number Editorial
by
C - Secret Number Editorial
by
penguinman
0000
から 9999
までの \(10^4\) 通りの暗証番号それぞれについて高橋くんの記憶に合致するかを判定し、合致するものの個数を数えることでこの問題を解くことができます。
実装の際は、0000
から 9999
までの暗証番号を「\(0\) 以上 \(9999\) 以下の整数に leading zero を付けたもの」と見做すことで簡潔なコードを書くことができます。例えば、\(1\) に leading zero を付けて生成される暗証番号は 0001
, \(132\) に leading zero を付けて生成される暗証番号は 0132
です。
計算量は \(M=10^4\) として \(O(M|S|)\) となります。
解答例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
string S; cin >> S;
int ans = 0;
for(int i=0; i<=9999; i++){
vector<bool> flag(10);
int X = i;
for(int j=0; j<4; j++){
flag[X%10] = true;
X /= 10;
}
bool flag2 = true;
for(int j=0; j<10; j++){
if(S[j]=='o' && !flag[j]) flag2 = false;
if(S[j]=='x' && flag[j]) flag2 = false;
}
ans += flag2;
}
cout << ans << endl;
}
解答例 (Python)
S = input()
ans = 0
for i in range(10000):
flag = [False]*10
now = i
for j in range(4):
flag[now%10] = True
now //= 10
flag2 = True
for j in range(10):
if S[j] == 'o' and not flag[j]:
flag2 = False
if S[j] == 'x' and flag[j]:
flag2 = False
ans += flag2
print(ans)
posted:
last update: