让你把所有的“连续的仅有首字母大写的”词组用缩写表示,并且在后面用括号注明原词组。
#include<cstdio> #include<cstring> using namespace std; char s[130]; bool iszimu(char c){ return ((c>='A' && c<='Z') || (c>='a' && c<='z')); } bool isbig(char c){ return (c>='A' && c<='Z'); } bool issmall(char c){ return (c>='a' && c<='z'); } bool check(int l,int r){ if(r-l+1==1){ return 0; } if(!isbig(s[l])){ return 0; } for(int i=l+1;i<=r;++i){ if(!issmall(s[i])){ return 0; } } return 1; } void print(int l,int r){ for(int i=l;i<=r;++i){ putchar(s[i]); } } void prin2(int l,int r){ for(int i=l;i<=r;++i){ if(isbig(s[i])){ putchar(s[i]); } } printf(" ("); for(int i=l;i<=r;++i){ putchar(s[i]); } putchar(')'); } int main(){ freopen("abbreviation.in","r",stdin); freopen("abbreviation.out","w",stdout); while(gets(s)){ int n=strlen(s),sta,cnt=0,end=-1,Sta,End=-1; for(int i=0;i<n;++i){ if((i==0 || !iszimu(s[i-1])) && iszimu(s[i])){ sta=i; } if((i==n-1 || !iszimu(s[i+1])) && iszimu(s[i])){ if(check(sta,i) && (cnt==0 || (end==sta-2 && s[end+1]==' '))){ ++cnt; if(cnt==1){ Sta=sta; End=end; } } else if(check(sta,i)){ if(cnt>=2){ print(End+1,Sta-1); prin2(Sta,end); } else if(cnt==1){ print(End+1,Sta-1); print(Sta,end); } cnt=1; Sta=sta; End=end; } else{ if(cnt>=2){ print(End+1,Sta-1); prin2(Sta,end); } else if(cnt==1){ print(End+1,Sta-1); print(Sta,end); } print(end+1,i); cnt=0; } end=i; } } if(cnt>=2){ print(End+1,Sta-1); prin2(Sta,end); } else if(cnt==1){ print(End+1,Sta-1); print(Sta,end); } print(end+1,n-1); puts(""); } return 0; }