洛谷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 }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮