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; }