题意:
思路:
运用STL中的find、erase、replace方法还有string的迭代器模拟。注意的是规则3、4、5、6是对原文而言,而不是对上一步规则的结果而言。但在我的理解中,题意有点问题,根据样例可以发现规则4并不是在原文基础上实施的,而是在规则3的结果基础上实施的。
AC code:
#include<iostream> #include<cstdio> #include<string> #include<algorithm> using namespace std; typedef string::iterator IT; int n; string s1,s2; char c; bool isBD(char c){ if(c>='a'&&c<='z') return false; if(c>='A'&&c<='Z') return false; if(c>='0'&&c<='9') return false; if(c==' ') return false; return true; } bool check(int l,int r){ int f1=0,f2=0; if(!l||s1[l-1]==' '||isBD(s1[l-1])) f1=1; if(r==s1.length()-1||s1[r+1]==' '||isBD(s1[r+1])) f2=1; return f1&&f2; } int main(){ std::ios::sync_with_stdio(false); std::cin.tie(0); cin>>n; cin.get(); while(n--){ getline(cin,s1); cout<<s1<<endl; for(IT it=s1.begin();it!=s1.end();++it){ if((*it)==' '){ IT it2=it; it2++; while(it2!=s1.end()&&(*it2)==' ') s1.erase(it2); } } IT it=s1.begin(); if((*it)==' ') s1.erase(it); it=s1.end(); --it; if((*it)==' ') s1.erase(it); for(IT it=s1.begin();it!=s1.end();++it) if(isBD((*it))){ if(it==s1.begin()) continue; IT it2=it; --it2; if((*it2)==' ') s1.erase(it2),it=it2; } for(IT it=s1.begin();it!=s1.end();++it) if((*it)>='A'&&(*it)<='Z'&&(*it)!='I') (*it)=(*it)+'a'-'A'; s2=s1; string f1="can you",r1="I can",rr1="xxxxx"; int p=0; while(p<s1.length()&&(p=s1.find(f1,p))!=string::npos){ if(check(p,p+7-1)){ s1=s1.replace(p,7,rr1); s2=s2.replace(p,7,r1); p+=5; } else{ p+=7; } } string f2="could you",r2="I could",rr2="xxxxxxx"; p=0; while(p<s1.length()&&(p=s1.find(f2,p))!=string::npos){ if(check(p,p+9-1)){ s1=s1.replace(p,9,rr2); s2=s2.replace(p,9,r2); p+=7; } else{ p+=9; } } string f3="I",r3="you",rr3="xxx"; p=0; while(p<s1.length()&&(p=s1.find(f3,p))!=string::npos){ if(check(p,p+1-1)){ s1=s1.replace(p,1,rr3); s2=s2.replace(p,1,r3); p+=3; } else{ p+=1; } } string f4="me",r4="you",rr4="xxx"; p=0; while(p<s1.length()&&(p=s1.find(f4,p))!=string::npos){ if(check(p,p+2-1)){ s1=s1.replace(p,2,rr4); s2=s2.replace(p,2,r4); p+=3; } else{ p+=2; } } for(IT it=s2.begin();it!=s2.end();++it) if((*it)=='?') (*it)='!'; cout<<"AI: "<<s2<<endl; } return 0; }