I18n
题意:给一个字符串,其中有一些缩写,即两个字符之间加一个数字k,代表特定两个字符开头结尾,其中中间有k个字符被简略掉,如果收到当前位置,前面出现过满足这样条件的单词,那么就输出该单词,否则直接输出
解法:暴力,这题并不难,但注意有些陷阱,首先就是大小写,判断该缩写是否出现过并不会判断大小写,如果出现过,那么分几点:假设出现了apple,那么缩写A3e就要输出Apple,如果A3E就要输出APPLE,如果前面出现多个满足的,那么就判定为矛盾,直接输出,譬如有son和sun,那么出现s1n就直接输出s1n。
#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
char data[80010][100], c, s[100], temp[100];
int a[80010] = {0};
int n, m, num, tempn, tempm;
bool isnum(char c) {
return (c >= '0' && c <= '9');
}
bool islet(char c) {
return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
}
bool isup(char c) {
return (c >= 'A' && c <= 'Z');
}
bool islow(char c) {
return (c >= 'a' && c <= 'z');
}
bool equal(char x, char y) {
if (x == y) return true;
if (x-'A'+'a' == y) return true;
if (x-'a'+'A' == y) return true;
return false;
}
int main() {
freopen("i18n.in","r",stdin);
freopen("i18n.out","w",stdout);
m = 0;
num = 0;
while (scanf("%c", &c) != EOF) {
if (isnum(c) || islet(c)) {
s[m++] = c;
if (isnum(c)) num++;
} else {
if (m > 0) {
if (m == 3 && islet(s[0]) && isnum(s[1]) && islet(s[2]) && s[1] != '0') {
int t = s[1]-'0', x = 0, y = 0;
tempn = 0; tempm = 0;
for (int i = 1; i <= n; i++) {
if (a[i] == t+2 && equal(s[0], data[i][0]) && equal(s[2], data[i][t+1])) {
if (isup(s[0])) x = 1;
if (isup(s[2])) y = 1;
for (int j = 0; j < a[i]; j++)
temp[j] = data[i][j];
if (y == 1) {
for (int j = 0; j < a[i]; j++)
temp[j] = temp[j]-'a'+'A';
} else if (x == 1) {
temp[0] = temp[0]-'a'+'A';
}
tempm = a[i];
tempn++;
}
}
if (tempn == 1) {
m = tempm;
for (int i = 0; i < m; i++) s[i] = temp[i];
}
for (int i = 0; i < m; i++)
printf("%c", s[i]);
m = 0;
num = 0;
} else if (m == 4 && islet(s[0]) && isnum(s[1]) && isnum(s[2]) && islet(s[3]) && s[1] != '0'){
int t = (s[1]-'0')*10+s[2]-'0';
int x = 0, y = 0;
tempn = 0; tempm = 0;
for (int i = 1; i <= n; i++) {
if (a[i] == t+2 && equal(s[0], data[i][0]) && equal(s[3], data[i][t+1])) {
if (isup(s[0])) x = 1;
if (isup(s[3])) y = 1;
for (int j = 0; j < a[i]; j++)
temp[j] = data[i][j];
if (y == 1) {
for (int j = 0; j < a[i]; j++)
temp[j] = temp[j]-'a'+'A';
} else if (x == 1) {
temp[0] = temp[0]-'a'+'A';
}
tempm = a[i];
tempn++;
}
}
if (tempn == 1) {
m = tempm;
for (int i = 0; i < m; i++) s[i] = temp[i];
}
for (int i = 0; i < m; i++)
printf("%c", s[i]);
m = 0;
num = 0;
} else {
for (int i = 0; i < m; i++) printf("%c", s[i]);
if (num == 0) {
for (int i = 0; i < m; i++) if (isup(s[i])) {
s[i] = s[i]-'A'+'a';
}
bool flag = false;
for (int i = 1; i <= n; i++) if (a[i] == m) {
flag = true;
for (int j = 0; j < m; j++) if (data[i][j] != s[j]) {
flag = false; break;
}
if (flag) break;
}
if (!flag) {
n++;
for (int i = 0; i < m; i++)
data[n][i] = s[i];
a[n] = m;
}
}
num = 0;
m = 0;
}
}
printf("%c", c);
}
}
//
if (m > 0) {
if (m == 3 && islet(s[0]) && isnum(s[1]) && islet(s[2]) && s[1] != '0') {
int t = s[1]-'0', x = 0, y = 0;
tempn = 0; tempm = 0;
for (int i = 1; i <= n; i++) {
if (a[i] == t+2 && equal(s[0], data[i][0]) && equal(s[2], data[i][t+1])) {
if (isup(s[0])) x = 1;
if (isup(s[2])) y = 1;
for (int j = 0; j < a[i]; j++)
temp[j] = data[i][j];
if (y == 1) {
for (int j = 0; j < a[i]; j++)
temp[j] = temp[j]-'a'+'A';
} else if (x == 1) {
temp[0] = temp[0]-'a'+'A';
}
tempm = a[i];
tempn++;
}
}
if (tempn == 1) {
m = tempm;
for (int i = 0; i < m; i++) s[i] = temp[i];
}
for (int i = 0; i < m; i++)
printf("%c", s[i]);
m = 0;
num = 0;
} else if (m == 4 && islet(s[0]) && isnum(s[1]) && isnum(s[2]) && islet(s[3]) && s[1] != '0'){
int t = (s[1]-'0')*10+s[2]-'0';
int x = 0, y = 0;
tempn = 0; tempm = 0;
for (int i = 1; i <= n; i++) {
if (a[i] == t+2 && equal(s[0], data[i][0]) && equal(s[3], data[i][t+1])) {
if (isup(s[0])) x = 1;
if (isup(s[3])) y = 1;
for (int j = 0; j < a[i]; j++)
temp[j] = data[i][j];
if (y == 1) {
for (int j = 0; j < a[i]; j++)
temp[j] = temp[j]-'a'+'A';
} else if (x == 1) {
temp[0] = temp[0]-'a'+'A';
}
tempm = a[i];
tempn++;
}
}
if (tempn == 1) {
m = tempm;
for (int i = 0; i < m; i++) s[i] = temp[i];
}
for (int i = 0; i < m; i++)
printf("%c", s[i]);
m = 0;
num = 0;
} else {
for (int i = 0; i < m; i++) printf("%c", s[i]);
if (num == 0) {
for (int i = 0; i < m; i++) if (isup(s[i])) {
s[i] = s[i]-'A'+'a';
}
bool flag = false;
for (int i = 1; i <= n; i++) if (a[i] == m) {
flag = true;
for (int j = 0; j < m; j++) if (data[i][j] != s[j]) {
flag = false; break;
}
if (flag) break;
}
if (!flag) {
n++;
for (int i = 0; i < m; i++)
data[n][i] = s[i];
a[n] = m;
}
}
num = 0;
m = 0;
}
}
fclose(stdin);fclose(stdout);
}