返回顶部

洛谷P1628合并序列【模板】(Trie+dfs)

很久之前写的题了,当时不知道怎么dfs所以卡了一段时间,^_^

题解:由于题目给了一大堆字符串,所以首先考虑应该可以建树,之后找到T所在的位置,对T所在的位置dfs就行了

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <stack>
 7 #include <queue>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <unordered_set>
12 #include <unordered_map>
13 #define ll long long
14 #define fi first
15 #define se second
16 #define pb push_back
17 #define me memset
18 const int N = 1e6 + 10;
19 const int mod = 1e9 + 7;
20 using namespace std;
21 typedef pair<int,int> PII;
22 typedef pair<long,long> PLL;
23 
24 int n,idx=0,x=0;
25 int son[N][26],cnt[N];
26 char str[110],tmp[110];
27 char ans[110];
28 
29 void insert(char str[]){           //建树
30     int p=0;
31     for(int i=0;str[i];++i){
32         int u=str[i]-'a';
33         if(!son[p][u])  son[p][u]=++idx;
34         p=son[p][u];
35     }
36     cnt[p]++;
37 }
38 
39 void dfs(int u){                     //dfs查找
40     while(cnt[u]--){
41         cout<<tmp;
42         for(int i=0;i<x;i++) cout<<ans[i];
43         cout<<endl;
44     }
45     for(int i=0;i<26;i++){
46         if(son[u][i]){
47             int r=u;
48             u=son[u][i];
49             ans[x++]=i+'a';
50             dfs(u);
51             u=r;
52             x--;
53         }
54     }
55 }
56 
57 int main(){
58     ios::sync_with_stdio(false);
59     cin>>n;
60     while(n--){
61         cin>>str;
62         insert(str);
63     }
64     cin>>tmp;
65     int p=0;
66     for(int i=0;tmp[i];i++){
67         int u=tmp[i]-'a';
68         p=son[p][u];
69     }
70     dfs(p);
71     return 0;
72 }

 

posted @ 2020-04-06 10:27  Rayotaku  阅读(159)  评论(0编辑  收藏  举报