一个大模拟,这题,就是一开始的时候找到第一个单词可以作为开始,然后往下去找,如果没有了,就输出一下那个括号,还有个就是逗号也要隔开,最后的时候也要再检查一遍
这个题其实,有很多简单的方法,但是自己写搓了~~,
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <math.h>
#include <stack>
#include <utility>
#include <string>
#include <sstream>
#include <cstdlib>
#include <set>
#define LL long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 10000 + 10;
int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
string in,out,ss,ans1,ans2;
int flag1,flag2;
void init()
{
flag1 = 0;
flag2 = 0;
ans1 = "";
ans2 = "";
}
int main()
{
freopen("abbreviation.in","r",stdin);
freopen("abbreviation.out","w",stdout);
while(getline(cin,in))
{
out = "";
init();
for(int i=0; i < in.size(); i++)
{
int j;
int f1=0,f2=0;
for(j=i; j<in.size(); j++)
{
if(('A' <= in[j] && in[j] <= 'Z') || ('a' <= in[j] && in[j] <= 'z'));
else
break;
ss += in[j];
if((j == i) && ('A' <= in[j] && in[j] <= 'Z'))
f1=1;
if((j != i) && ('A' <= in[j] && in[j] <= 'Z'))
f1=0;
if(('a' <= in[j] && in[j] <= 'z'))
f2=1;
}
if(f1&&f2)
{
if(flag1 && flag2 == 0)
flag2=1;
if(flag1 == 0)
flag1=1;
ans1 += in[i];
ans2 += ss + in[j];
}
else
{
if(flag2 == 0)
{
out += ans2;
init();
}
if(flag2 == 1)
{
out += ans1 + " ("+ans2.substr(0,ans2.size()-1)+")" + ans2[ans2.size()-1];
init();
}
out += ss;
if(j != in.size())
out += in[j];
}
if(in[j] != ' ' && j != in.size())
{
if(flag2 == 0)
{
out += ans2;
init();
}
if(flag2 == 1)
{
out += ans1 + " ("+ans2.substr(0,ans2.size()-1)+")" + ans2[ans2.size()-1];
init();
}
}
i = j;
ss = "";
}
if(in[in.size()-1] == ' ')
{
if(flag2 == 0)
{
out += ans2;
init();
}
if(flag2 == 1)
{
out += ans1 + " ("+ans2.substr(0,ans2.size()-1)+")" + ans2[ans2.size()-1];
init();
}
}
else
{
if(flag2 == 0)
{
out += ans2.substr(0,ans2.size()-1);
init();
}
if(flag2 == 1)
{
out += ans1 + " (" + ans2.substr(0,ans2.size()-1) + ")";
init();
}
}
cout<<out<<endl;
}
return 0;
}