a b c d ------- 2 1 1 2 2 2 1 1 2 2 2 0
↓あとで (accepted in practice)
class StringGame { public: vector <int> getWinningStrings(vector <string> S) { int N=S.size(); VVI hi(N, VI(26)); REP(i, N) { REP(j, S[i].size()) { hi[i][S[i][j]-'a']++; } } cout<<hi<<endl; vector<int> ans; REP(i, N) { string alpha; VI live(N, 1); live[i]=0; REP(loop, 26) { REP(c, 26) { int lose_char=0; REP(j, N) { if(live[j] && hi[j][c] > hi[i][c]) lose_char=1; } if(lose_char) continue; REP(j, N) { if(live[j] && hi[j][c] < hi[i][c]) { live[j]=0; // アルファベットの順番(のうち確定したものだけ)も出すようにしてみる if(alpha.find(c+'a')==string::npos) alpha.PB(c+'a'); } } } } //cout<<live<<endl; cout<<i<<" "<<(accumulate(ALL(live), 0LL)==0 ? "OK":"NG")<<" Alphabet: "<<alpha<<endl; if(accumulate(ALL(live), 0LL)==0) ans.PB(i); } return ans; } };
"aabcdd", "aabbcd", "aabbcc" の場合 0 OK Alphabet: d 1 OK Alphabet: bd 2 OK Alphabet: bc