Coder-Strike Round1に参加。
Dで苦戦したけど2Hackを決めそこそこの順位。
http://codeforces.com/contest/412/problem/C
解法
答えの文字列の各位置に対し、以下の処理を行えばよい。
- 2種類以上の小文字が登場するなら、そこは'?'にする。
- 1種類の小文字が登場するなら、そこはその文字にする。
- 0種類の小文字、すなわち全部'?'なら、適当な小文字を割り当てる。
int N; int mask[100001]; char hoge[100001]; void solve() { int f,i,j,k,l,x,y; string S; cin>>N; FOR(i,N) { cin>>S; l=S.size(); FOR(x,S.size()) { if(S[x]=='?') mask[x] |= 1<<30; else mask[x] |= 1<<(S[x]-'a'); } } FOR(i,l) { x=__builtin_popcount(mask[i]&((1<<26)-1)); if(x==0) hoge[i]='a'; else if(x==1) { FOR(y,26) if(mask[i]&(1<<y)) hoge[i]='a'+y; } else hoge[i]='?'; } _P("%s\n",hoge); }
まとめ
Div2 Cとしてもちょっと簡単に感じた。