比赛 20120302 评测结果 AAAAAAAAAA
题目名称 有道搜索框 最终得分 100
用户昵称 王者自由 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-03-02 19:17:47
显示代码纯文本
#include <cstdio>
#include <cstring>
const int N = 10000 * 20 + 10;
const int nil = -1;
struct node {
    int r[26];
    short is;
} T[N];
int t, u, n, q;
char w[30], s[30];
void Ins(char* s) {
    int p = 0, k = 0;
    while(s[k]) {
        int v = s[k] - 'a';
        if(T[p].r[v] == nil)
            T[p].r[v] = ++t;
        p = T[p].r[v];
        k++;
    }
    T[p].is = 1;
}
void DFS(int k, int p) {
    if(u >= 8)
        return;
    if(T[p].is != nil) {
        w[k] = 0;
        if(u > 0)
            printf(" ");
        printf("%s", w);
        u++;
    }
    for(int i=0; i<26; i++) {
        if(T[p].r[i] != nil) {
            w[k] = i + 'a';
            DFS(k+1, T[p].r[i]);
        }
    }
}
void Find(char* s) {
    int p = 0, k = 0;
    while(s[k] && p != nil) {
        p = T[p].r[s[k] - 'a'];
        k++;
    }
    if(p == nil) {
        printf("%s\n", s);
        return;
    }
    u = 0;
    for(int i=0; i<k; i++)
        w[i] = s[i];
    DFS(k, p);
    printf("\n");
}
int main() {
    freopen("youdao.in", "r", stdin);
    freopen("youdao.out", "w", stdout);
    memset(T, nil, sizeof(T));
    scanf("%d", &n);
    for(int i=0; i<n; ++i) {
        scanf("%s", s);
        Ins(s);
    }
    scanf("%d", &q);
    for(int i=0; i<q; ++i) {
        scanf("%s", s);
        Find(s);
    }
    return 0;
}