hdu5687 字典树

hdu5687

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e5+5, n = 26;
 4 struct node {
 5     int next[26];
 6     int cnt;
 7     void init() {
 8         cnt = 0;
 9         memset(next,-1,sizeof(next));
10     }
11 };
12 node trie[maxn*n];
13 int tot = 0;
14 void insert(char *s) {
15     int cur = 0, len = strlen(s);
16     for (int i = 0; i < len; i++) {
17         int temp = s[i]-'a';
18         int next = trie[cur].next[temp];
19         if (next == -1) {
20             next = ++tot;
21             trie[next].init();
22             trie[cur].next[temp] = next;
23         }
24         cur = next;
25         trie[cur].cnt++;
26     }
27 }
28 bool find(char *s) {
29     int cur = 0, len = strlen(s);
30     for (int i = 0; i < len; i++) {
31         int temp = s[i]-'a';
32         int next = trie[cur].next[temp];
33         if (next == -1) return false;
34         cur = next;
35     }
36     return trie[cur].cnt > 0;
37 }
38 void del(char * s) {
39     int cur = 0, late, len = strlen(s);
40     for (int i = 0; i < len; i++) {
41         int temp = s[i]-'a';
42         int next = trie[cur].next[temp];
43         if (next == -1) return;
44         late = cur;
45         cur = next;
46     }
47     cur = 0;
48     for (int i = 0; i < len; i++) {
49         int temp = s[i]-'a';
50         int next = trie[cur].next[temp];
51         late = cur;
52         cur = next;
53         trie[cur].cnt--;
54     }
55     trie[cur].init();
56     int temp = s[len-1]-'a';
57     trie[late].next[temp] = -1;
58 }
59 int main() {
60     int n; scanf("%d",&n);
61     char cmd[32], word[32];
62     for (int i = 1; i <= n; i++) {
63         scanf("%s%s",cmd,word);
64         if (cmd[0] == 'i') insert(word);
65         else if (cmd[0] == 's') {
66             if (find(word)) puts("Yes");
67             else puts("No");
68         }
69         else del(word);
70     }
71     return 0;
72 }

 

posted @ 2019-10-20 19:41  麻辣猪仔  阅读(110)  评论(0)    收藏  举报