字典树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('\n'); 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 }