A - Abbreviation (模拟)
题目链接:http://codeforces.com/gym/101190/attachments
题意:有一些单词组成的句子,把它们改变一下形式输出。
比如:This is ACM North Eastern European Regional Contest,
改成:This is ACM NEERC (North Eastern European Regional Contest),
思路:字符串的模拟最好用string类,里面一个+号直接加字符很好用。并且在“单词”数量不多的情况下尽量把每个“单词”都提取出来再进行处理。
代码:
#include <bits/stdc++.h>
using namespace std;
string a[202];
string b[202];
string s,sum;
int cnt1,cnt2,cnt;
char first[105];
int i,j,len;
int isok( string a )
{
if ( a[0]<'A'||a[0]>'Z' ) {
return 0;
}
if ( a.size()<=1 ) {
return 0;
}
for ( int i=1; i<a.size(); i++ ) {
if ( a[i]<'a'||a[i]>'z' ) {
return 0;
}
}
return 1;
}
void pri()
{
if ( cnt<=1 ) {
cout << sum ;
}
else {
for ( int j=0; j<cnt; j++ ) {
cout << first[j];
}
cout << " (" << sum << ")";
}
sum = "";
cnt = 0;
}
int main()
{
freopen("abbreviation.in","r",stdin);
freopen("abbreviation.out","w",stdout);
while ( getline(cin,s) ) {
len = s.size();
cnt1 = cnt2 = 0;
for ( i=0; i<len; ) {
a[cnt1] = "";
while ( isalpha(s[i]) ) {
a[cnt1]+=s[i];
i ++;
}
cnt1 ++;
b[cnt2] = "";
while ( !isalpha(s[i])&&i<len ) {
b[cnt2] += s[i];
i ++;
}
cnt2 ++;
}
sum = "";
cnt = 0;
for ( i=0; i<cnt1; i++ ) {
if ( isok(a[i]) ) {
if ( sum!="" ) {
sum += b[i-1];
}
sum += a[i];
first[cnt++] = a[i][0];
if ( b[i]!=" " ) {
pri();
cout << b[i];
}
}
else {
if ( i>=1 && sum!="" ) {
pri();
cout << b[i-1];
}
else {
pri();
}
cout << a[i] << b[i];
}
}
cout << endl;
}
return 0;
}