题目链接:https://cn.vjudge.net/problem/Gym-101190A
题目大意:将串中符合首字符大写其余字母小写的单词和其他符合这种情况的只间隔一个空格的单词的首字母提出来,其余字符用括号括起来
思路概括:遍历整个串,将符合要求的单词预处理出来,然后在遍历去提取加括号
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define lt k<<1
#define rt k<<1|1
#define lowbit(x) x&(-x)
#define lson l,mid,lt
#define rson mid+1,r,rt
using namespace std;
typedef long long ll;
typedef long double ld;
//#define int ll
#define ios ios::sync_with_stdio(false);cin.tie(nullptr);
#define mem(a, b) memset(a, b, sizeof(a))
const double pi = acos(-1.0);
const double eps = 1e-6;
const ll mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 1e6 + 50;
bool ju_d(char ch)
{
if(ch >='A' && ch <= 'Z') return true;
else return false;
}
bool ju_x(char ch)
{
if(ch >= 'a' && ch <= 'z') return true;
else return false;
}
char s[maxn];
char t[maxn];
int vis[maxn];
int main()
{
freopen("abbreviation.in", "r", stdin);
freopen("abbreviation.out", "w", stdout);
while(gets(s))
{
mem(vis, 0);
int len = strlen(s);
for(int i=0; i<len; i++)
{
bool flag = true;
if(ju_d(s[i]))
{
if(i ==0 || s[i - 1] == '.' || s[i-1] == ',' || s[i-1] == ' ')
{
int x = i;
while(s[i] != ' ')
{
i++;
if(ju_d(s[i])) flag = false;
if(s[i] == '.' || s[i] == ',' || s[i] == '\0')
{
break;
}
}
if(flag)
{
vis[x] = 1;
vis[i-1] = 1;
}
}
}
}
// for(int i=0; i<len; i++)
// {
// cout << i << ' ' << vis[i] << endl;
// }
int pos = 0, y = -1, num, cnt;
for(int i=0; i<len; i++)
{
bool flagg = true;
if(vis[i])
{
t[pos++] = s[i];
for(int j=i+1; j<len; j++)
{
if(s[j] == ' ')
{
if(!vis[j + 1])
{
flagg = false;
break;
}
else if(!ju_x(s[j-1]) || !ju_x(s[j+2]))
{
flagg = false;
break;
}
else if(vis[j-1] && vis[j+1] && ju_x(s[j-1]) && !ju_x(s[j+1]))
{
// cout << "!!" << endl;
vis[j-1] = 0;
vis[j+1] = 0;
t[pos++] = s[j+1];
y = j+1;
}
}
if(s[j] == '.' || s[j] == ',') break;
}
// cout << "y" << ' ' << y << endl;
if(y == -1) pos--;
if(y!=-1)
{
// cout << flagg << endl;
if(y!=-1)
{
t[pos++] = ' ';
t[pos++] = '(';
}
// cout << "y" << ' ' << y << endl;
while(y < len)
{
vis[y] = 0;
if(s[y] == '.' || s[y] == ',' || s[y] == ' ')
{
break;
}
y++;
}
}
}
t[pos++] = s[i];
if(i==y-1)
{
// cout << i << endl;
t[pos++] = ')';
y = -1;
}
}
// for(int i=0; i<len; i++)
// {
// cout << i << ' ' << vis[i] << endl;
// }
for(int i=0; i<pos; i++) cout << t[i];
cout << endl;
}
return 0;
}