3510 A Tale from the Dark Side of the Moon

問題概要

与えられた文字列について

  • "dd"をpに置換
  • "ei"をieに置換。ただし、ceiは置換しない
  • "pink"を"floyd"に置換
  • 英小文字およびスペース以外の文字を削除
  • EOFが現れたらその時点で処理を中止。

の操作をせよ。

解法

言われた操作をすれば良いが、置換を順番に行うと、
ddinkをfloydに置換してしまうようなことがおこりうるので、
ddを一度記号などに置き換えるとよい。

ソースコード

bool ok;
string func(string &s){
	int p=0;
	if((p=s.find("EOF"))!=string::npos){
		s=s.substr(0,p); ok=0;
		return func(s);
	}
	fr(i,s)if(*i!=' '&&!('a'<=*i&&*i<='z'))*i='@';
	
	p=0;
	while((p=s.find("ei",p))!=string::npos){
		if(p==0||s[p-1]!='c')swap(s[p],s[p+1]);
		p+=2;
	}
	p=0;
	while((p=s.find("dd",p))!=string::npos){
		s=s.substr(0,p)+"+"+s.substr(p+2);
	}
	p=0;
	while((p=s.find("pink",p))!=string::npos){
		s=s.substr(0,p)+"floyd"+s.substr(p+4);
	}
	
	string r;
	fr(i,s){
		if(*i=='+')r.pb('p');
		if(*i==' '||'a'<=*i&&*i<='z')r.pb(*i);
	}
	return r;
}
int main(){
	string str; ok=1;
	while(ok&&getline(cin,str))cout<<func(str)<<endl;
	return 0;
}