なんだか変な問題。
https://codeforces.com/contest/1276/problem/A
問題
文字列が与えられる。
一部の位置の文字を削除し、"one"と"two"いずれも部分文字列に現れないようにしたい。
最小何文字削ればいいか。
解法
基本的に"two"となっている部分のwと"one"となっているところのnを削ればよい。
"twone"となっているところだけは"o"を削ると効率的。
int T; int N; string S; void solve() { int i,j,k,l,r,x,y; string s; cin>>T; while(T--) { cin>>S; N=S.size(); set<int> R; FOR(i,N) { if(i+5<=N && S.substr(i,5)=="twone") { R.insert(i+2); } } vector<pair<int,char>> V; FOR(i,N) { if(R.count(i)==0) V.push_back({i,S[i]}); } FOR(i,V.size()-1) if(i) { if(V[i-1].second=='t' && V[i].second=='w' && V[i+1].second=='o') { R.insert(V[i].first); } if(V[i-1].second=='o' && V[i].second=='n' && V[i+1].second=='e') { R.insert(V[i].first); } } cout<<R.size()<<endl; FORR(r,R) cout<<r+1<<" "; cout<<endl; } }
まとめ
Div1で出されるともうひとひねりいるんじゃないかと不安になる。