您的位置:首页 > 其它

poj 2001(trie)

2015-09-18 23:13 477 查看
题意:给一些单词,输出每个单词的一个前缀使这个前缀能唯一标识这个单词。

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

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 40005;
char str
[30];
int ch
[30], val
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: