字典树Trie

第13次提交终于0->100的原因居然是——没有判重???!

https://www.luogu.org/problem/P3879算是道略显恶心的板子题吧,唯一一点以后可以继承的经验是trie数组利用了结构体+vector的方式解决了空间与维度的问题。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<cstring>
 5 using namespace std; 
 6 
 7 struct Node{
 8     int a[26];
 9     Node(){memset(a,0,sizeof a);}
10     int& operator [](int x){return a[x];}
11 }zero;
12 
13 string s;
14 vector<Node> trie;
15 vector<int> cntw[500010];
16 
17 void add(int i){
18     int p = 0;
19     for(int j = 0;j < s.size();j++){
20         int ne = s[j]-'a';
21         if(!trie[p][ne]){
22             trie[p][ne] = trie.size();
23             trie.push_back(zero);
24         }
25         p = trie[p][ne];
26     }
27     if(cntw[p].empty()||cntw[p].size()&&i^cntw[p][cntw[p].size()-1])
28         cntw[p].push_back(i);
29 }
30 
31 void work(){
32     int flag = 1,p = 0;
33     for(int i = 0;i < s.size();++i){
34         int ne = s[i]-'a';
35         if(!trie[p][ne]){flag = 0;break;}
36         p = trie[p][ne];
37     }
38     if(flag)for(int i = 0;i < cntw[p].size();++i)
39         printf("%d ",cntw[p][i]);
40     putchar('
');
41 }
42 
43 int n,m;
44 
45 int main(){
46     trie.push_back(zero);
47     cin >> n;
48     for(int i = 1;i <= n;i++){
49         int x;cin >> x;
50         for(int j = 1;j <= x;j++){
51             cin >> s;
52             add(i);
53         }
54     }
55     cin >> m;
56     for(int i = 1;i <= m;i++){
57         cin >> s;
58         work();
59     }    
60 return 0;
61 }
原文地址:https://www.cnblogs.com/Wangsheng5/p/11774699.html