codeforces #291 div2 C(Trie,DFS)
2015-02-15 04:22:53
思路:一道比较明显的字典树... 看起来数据会比较大,所以用静态版Trie比较保险。
把所有的初始串读进Trie中,然后就是Dfs来枚举哪一位不一样了。
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <vector> 6 #include <map> 7 #include <set> 8 #include <stack> 9 #include <queue> 10 #include <string> 11 #include <iostream> 12 #include <algorithm> 13 using namespace std; 14 15 #define MEM(a,b) memset(a,b,sizeof(a)) 16 #define REP(i,n) for(int i=1;i<=(n);++i) 17 #define REV(i,n) for(int i=(n);i>=1;--i) 18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i) 19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i) 20 #define getmid(l,r) ((l) + ((r) - (l)) / 2) 21 #define MP(a,b) make_pair(a,b) 22 23 typedef long long ll; 24 typedef pair<int,int> pii; 25 const int INF = (1 << 30) - 1; 26 27 int n,m,tlen,tot; 28 char s[6000005]; 29 30 struct Trie{ 31 int next[3]; 32 int v; 33 }t[6000005]; 34 35 void Insert_tree(char *str){ 36 int len = strlen(str); 37 int p = 0; 38 for(int i = 0; i < len; ++i){ 39 int id = str[i] - 'a'; 40 if(t[p].next[id] == 0){ 41 t[p].next[id] = ++tot; 42 } 43 p = t[p].next[id]; 44 } 45 t[p].v = 1; 46 } 47 48 bool Dfs(int cur,int p,int flag){ 49 if(p >= tlen){ 50 if(flag && t[cur].v) return true; 51 else return false; 52 } 53 int id = s[p] - 'a'; 54 if(flag == 0){ //change 55 for(int i = 0; i < 3; ++i) if(i != id && t[cur].next[i]){ 56 if(Dfs(t[cur].next[i],p + 1,1)) 57 return true; 58 } 59 } 60 if(t[cur].next[id] && Dfs(t[cur].next[id],p + 1,flag)) //no change 61 return true; 62 return false; 63 } 64 65 int main(){ 66 tot = 0; 67 scanf("%d%d",&n,&m); 68 REP(i,n){ 69 scanf("%s",s); 70 Insert_tree(s); 71 } 72 REP(i,m){ 73 scanf("%s",s); 74 tlen = strlen(s); 75 if(Dfs(0,0,0)) printf("YES\n"); 76 else printf("NO\n"); 77 } 78 return 0; 79 }