题意:给出每个单词的第一种写法和第二种写法,然后询问给出第二种写法的一个单词,要求输出它的第一种写法,没有就输出eh。
题解:字典序建树,val[i]就存到节点i为止的对应第一种字符串,然后扫描每个询问单词看是否有解。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000005;
int sz, ch[N][30];
char val[N][30];
void insert(char *s, char *v) {
int u = 0, len = strlen(s);
char temp[1];
for (int i = 0; i < len; i++) {
int k = s[i] - 'a';
if (!ch[u][k]) {
memset(ch[sz], 0, sizeof(ch[sz]));
memset(val[sz], 0, sizeof(val[sz]));
ch[u][k] = sz++;
}
u = ch[u][k];
}
strcpy(val[u], v);
}
bool query(char *s) {
int u = 0, len = strlen(s);
for (int i = 0; i < len; i++) {
int k = s[i] - 'a';
if (!ch[u][k])
return false;
u = ch[u][k];
}
printf("%s\n", val[u]);
return true;
}
int main() {
sz = 1;
memset(ch[0], 0, sizeof(ch[0]));
char str1[15], str2[15], str[40];
while (gets(str) && strlen(str) != 0) {
int cnt1 = 0, cnt2 = 0, cnt = 0;
while (str[cnt] != ' ') {
str1[cnt1++] = str[cnt];
cnt++;
}
cnt++;
str1[cnt1] = 0;
while (str[cnt] != 0) {
str2[cnt2++] = str[cnt];
cnt++;
}
str2[cnt2] = 0;
insert(str2, str1);
}
while (scanf("%s", str) == 1) {
if (!query(str))
printf("eh\n");
}
return 0;
}