写起来有点爽~~
题意是给你一篇文章,让你把缩写词还原,其他的标点原样输出,缩写规则是保留头尾字母中间的所有字母换成一个他们长度对应的数字。完整词有三种(首字母大写,全都大写,全都小写),缩写词有三种(全都小写,首尾都大写,首字母大写尾字母小写)。
有好多坑点:
1.不要用sring,容易超时。
2.输入不区分大小写,也就是ABC和abc是一样的。
3.输出区分大小写,比如之前有读入ABBC这个单词,然后读到a2c应该输出abbc,读到A2c应该输出Abbc,读到A2C应该输出ABBC。
4.如果缩写词还原时产生歧义应该原样输出缩写词,比如前面有problem和program缩写都是p5m就分不清了,那就原样输出p5m。
5.如果出现没出现的缩写词就原样输出。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
#define maxn 211
#define INF 111111111
#define left Left
#define eps 1e-10
struct node {
char a[33][35];
}gg[57][57];
const char aa[] = {"morejarphone"};
int f (char a) {
if (a <= 'Z')
return a-'A'+1;
else
return a-'a'+1;
}
bool biaodian (char ch) {
if (ch <= 'z' && ch >= 'a') return 0;
if (ch <= 'Z' && ch >= 'A') return 0;
if (ch <= '9' && ch >= '0') return 0;
return 1;
}
char daxie (char ch) {
if (ch <= 'z' && ch >= 'a')
return ch-'a'+'A';
return ch;
}
char xiaoxie (char ch) {
if (ch <= 'Z' && ch >= 'A')
return ch-'A'+'a';
return ch;
}
char cur[35];
int main () {
//freopen ("data.txt", "r", stdin);
for (int i = 1; i <= 52; i++) {
for (int j = 1; j <= 52; j++) {
for (int k = 0; k <= 32; k++)
gg[i][j].a[k][0] = '\0';
}
}
char ch;
while ((ch = getchar ()) != EOF) {
while (biaodian (ch)) { //前导标点
if (ch == EOF) goto out;
printf ("%c", ch);
ch = getchar ();
}
int len = 0, mid;
while (!biaodian (ch)) {
cur[len++] = ch;
ch = getchar ();
}
cur[len] = '\0';
char pp[35];
for (int i = 0; i <= len; i++)
pp[i] = xiaoxie (cur[i]);
if (cur[1] <= '9' && cur[1] >= '0') {
int i = 1, num = 0;
while (cur[i] <= '9' && cur[i] >= '0') {
num = num*10 + cur[i]-'0';
i++;
}
int x = f (pp[0]), y = f (pp[len-1]);
if (strcmp (gg[x][y].a[num], aa) != 0 && strcmp (gg[x][y].a[num], "") != 0) {
if (cur[0] <= 'Z' && cur[len-1] <= 'Z') {
printf ("%c", cur[0]);
for (int i = 1; i < strlen (gg[x][y].a[num])-1; i++)
printf ("%c", daxie (gg[x][y].a[num][i]));
printf ("%c", cur[len-1]);
}
else {
printf ("%c", cur[0]);
for (int i = 1; i < strlen (gg[x][y].a[num]); i++)
printf ("%c", gg[x][y].a[num][i]);
}
}
else {
for (int i = 0; i < len; i++)
printf ("%c", cur[i]);
}
}
else {
mid = len-2;
int x = f (pp[0]), y = f (pp[len-1]);
if (strcmp (gg[x][y].a[mid], "") == 0) {
for (int i = 0; i <= len; i++)
gg[x][y].a[mid][i] = pp[i];
}
else if (strcmp (gg[x][y].a[mid], pp) != 0) {
for (int i = 0; i <= strlen (aa); i++)
gg[x][y].a[mid][i] = aa[i];
}
for (int i = 0; i < len; i++)
printf ("%c", cur[i]);
}
printf ("%c", ch);
}
return 0;
}