题意:给出每个单词的第一种写法和第二种写法,然后询问给出第二种写法的一个单词,要求输出它的第一种写法,没有就输出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;
}