字典树trie模板+例题

模板:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1000010;
 4 int trie[N][30];
 5 int color[N];
 6 int k = 1;
 7 
 8 void insert_trie(char* w) {
 9     int len = strlen(w);
10     int p = 0;
11     for (int i = 0; i < len; i++) {
12         int c = w[i] - 'a';
13         if (!trie[p][c]) {
14             trie[p][c] = k;
15             k++;
16         }
17         p = trie[p][c];
18     }
19     color[p] = 1;
20 }
21 bool search_trie(char* s) {
22     int len = strlen(s);
23     int p = 0;
24     for (int i = 0; i < len; i++) {
25         int c = s[i] - 'a';
26         if (!trie[p][c]) return 0;
27         p = trie[p][c];
28     }
29     return color[p];
30 }
31 
32 char ch[100];
33 
34 int main() {
35     
36     int n, m;
37     cin >> n;
38     for (int i = 0; i < n; i++) {
39         cin >> ch;
40         insert_trie(ch);
41     }
42     cin >> m;
43     for (int i = 0; i < m; i++) {
44         cin >> ch;
45         if (search_trie(ch)) cout << "YES" << "\n";
46         else cout << "NO" << "\n";
47     }
48 
49     return 0;
50 }

例题:洛谷 P2580 于是他错误的点名开始了

题目传送门:https://www.luogu.com.cn/problem/P2580

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN_NODE = 1000010;
 4 const int MAXN_ZM = 30;
 5 int trie[MAXN_NODE][MAXN_ZM];
 6 int color[MAXN_NODE];
 7 int k = 1;
 8 
 9 void insert_trie(char* w) {
10     int len = strlen(w);
11     int p = 0;
12     for (int i = 0; i < len; i++) {
13         int c = w[i] - 'a';
14         if (!trie[p][c]) {
15             trie[p][c] = k;
16             k++;
17         }
18         p = trie[p][c];
19     }
20     color[p] = 1;
21 }
22 int search_trie(char* s) {
23     int len = strlen(s);
24     int p = 0;
25     for (int i = 0; i < len; i++) {
26         int c = s[i] - 'a';
27         if (trie[p][c]) {
28             p = trie[p][c];
29         }
30         else return 3;
31     }
32     if (color[p] == 1) {
33         color[p]++;
34         return 1;
35     }
36     else if (color[p] > 1) {
37         return 2;
38     }
39 }
40 
41 char ch[100];
42 
43 int main() {
44     
45     int n, m;
46     cin >> n;
47     for (int i = 0; i < n; i++) {
48         cin >> ch;
49         insert_trie(ch);
50     }
51     cin >> m;
52     for (int i = 0; i < m; i++) {
53         cin >> ch;
54         int hh = search_trie(ch);
55         if (hh == 1) {
56             cout << "OK" << "\n";
57         }
58         else if(hh == 2) {
59             cout << "REPEAT" << "\n";
60         }
61         else {
62             cout << "WRONG" << "\n";
63         }
64     }
65 
66     return 0;
67 }

 

 
posted @ 2022-07-27 10:20  Keyzee  阅读(29)  评论(0编辑  收藏  举报