kmjp's blog

競技プログラミング参加記です

Codeforces #606 Div1 A. As Simple as One and Two

なんだか変な問題。
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で出されるともうひとひねりいるんじゃないかと不安になる。