POJ 3630 Trie

链接:

http://poj.org/problem?id=3630

题意:

给你n个字符串,判断有没有字符串是其他字符串的前缀

题解:

建一个字典树,在插入的过程中,如果没有新建一个结点,那这个字符串肯定是其他字符串的前缀,

如果新建结点的时候发现,有的字符串以这个字符结尾,那肯定有字符串是这个字符串的前缀

代码:

31 int pi = 1;
32 int fg;
33 
34 struct Node {
35     int next[10];
36     bool end;
37 }tree[MAXN];
38 
39 void insert(string keyword) {
40     int index, p, i;
41     int flag = 0;
42     for (i = p = 0; keyword[i]; i++) {
43         index = keyword[i] - '0';
44         if (tree[p].next[index] == 0) {
45             tree[p].next[index] = pi++;
46             flag = 1;
47             if (tree[p].end) fg = 0;
48         }
49         p = tree[p].next[index];
50     }
51     if (!flag) fg = 0;
52     tree[p].end = 1;
53 }
54 
55 int main() {
56     int T;
57     cin >> T;
58     while (T--) {
59         pi = 1;
60         fg = 1;
61         memset(tree, 0, sizeof(tree));
62         int n;
63         cin >> n;
64         while (n--) {
65             string s;
66             cin >> s;
67             insert(s);
68         }
69         if (fg) cout << "YES" << endl;
70         else cout << "NO" << endl;
71     }
72     return 0;
73 }

 

posted @ 2017-04-30 20:33  Flowersea  阅读(178)  评论(0编辑  收藏  举报