poj 2001(trie)

来源:互联网 发布:光电材料仿真软件 编辑:程序博客网 时间:2024/06/06 10:38

题意:给一些单词,输出每个单词的一个前缀使这个前缀能唯一标识这个单词。
题解:先建字典树,用val[i]保存当前节点是多少个单词的前缀,然后再从头把每个单词放到字典树里查询,直到val[i]==1结束,表示到这里只能标识唯一单词,当前位置就是要输出的前缀的结尾位置。

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 40005;char str[N][30];int ch[N][30], val[N];int sz;void insert(char *s) {    int u = 0, len = strlen(s);     for (int i = 0; i < len; i++) {         int k = s[i] - 'a';         if (!ch[u][k]) {            memset(ch[sz], 0, sizeof(ch[sz]));            val[sz] = 1;                ch[u][k] = sz++;         }         else            val[ch[u][k]]++;        u = ch[u][k];    }}void query(char *s) {    int u = 0, len = strlen(s);    for (int i = 0; i < len; i++) {        int k = s[i] - 'a';        if (val[ch[u][k]] == 1) {            if (i < len)                printf("%c", s[i]);            break;        }        else            printf("%c", s[i]);        u = ch[u][k];    }}int main() {    int cnt = 0;    sz = 1;    memset(ch[0], 0, sizeof(ch[0]));    while (scanf("%s", str[cnt]) == 1) {        insert(str[cnt]);               cnt++;    }    for (int i = 0; i < cnt; i++) {        printf("%s ", str[i]);        query(str[i]);        printf("\n");    }    return 0;}
0 0
原创粉丝点击