字典树trie——洛谷P2580 于是他错误的点名开始了
洛谷P2580 于是他错误的点名开始了
是字典树的板子题目,这里重复的话可以对exist进行处理,如果说第一次遇到的情况是exist是1的话,这就说明她是一个被第一次访问并且是存在的单词,然后对exist进行加1操作,我觉的这个就是个小技巧,子啊学习二分图中的匈牙利算法的时间戳优化学习到的,还是挺实用的,注意这里要把maxn开大一点,我觉的这里是题目的问腿,明明说是只有10000个,但其实不止。
1 #include<iostream>
2 #include<string>
3 #include<cstdio>
4 #include<cstring>
5 using namespace std;
6 const int len = 55;
7 const int maxn = 500010;
8
9 struct trie{
10 int next[maxn][27];
11 int cnt;
12 int exist[maxn];
13 void ini()
14 {
15 memset(next, 0, sizeof(next));
16 memset(exist, 0, sizeof(exist));
17 cnt = 1; //0号结点是空的,所以新创建的结点是1开始的
18 }
19 void insert(string str)
20 {
21 int l = str.size();
22 int p = 0;
23 for(int i = 0; i < l; i++)
24 {
25 int v = str[i]-'a';
26 if(!next[p][v])
27 next[p][v] = cnt++;
28 p = next[p][v];
29 }
30 exist[p] = 1;
31 }
32 int find(string str)
33 {
34 int l = str.size();
35 int p = 0;
36 for(int i = 0; i < l; i++)
37 {
38 int v = str[i]-'a';
39 if(next[p][v]) p = next[p][v];
40 else
41 {
42 printf("WRONG\n");
43 return 0;
44 }
45 }
46 if(exist[p] == 0)
47 {
48 printf("WRONG\n");
49 }
50 else if(exist[p] == 1)
51 {
52 printf("OK\n");
53 exist[p]++;
54 }
55 else
56 {
57 printf("REPEAT\n");
58 }
59 return 1;
60 }
61 };
62 int main()
63 {
64 int n;
65 scanf("%d", &n);
66 string str;
67 struct trie root;
68 root.ini();
69 for(int i = 0; i < n; i++)
70 {
71 cin >> str;
72 root.insert(str);
73 }
74 int m;
75 cin >> m;
76 for(int i = 0; i < m; i++)
77 {
78 cin >> str;
79 root.find(str);
80 }
81 return 0;
82 }

浙公网安备 33010602011771号