C. Watto and Mechanism 字典树 Codeforces Round #291 (Div. 二)
C. Watto and Mechanism 字典树 Codeforces Round #291 (Div. 2)
题意:给n个字符串和m次询问,每次询问的字符串如果能够由前面n个字符串中的某一个只改变一个字母得到 输出YES,否则NO。
用字典树解决,渣渣不熟悉字典树,写在这里以后多看看。。。。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #pragma comment (linker,"/STACK:102400000,102400000") #define maxn 601005 #define MAXN 3 #define mod 1000000009 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-6 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r typedef long long ll; using namespace std; typedef struct TrieNode { int nCount; //标记该结点是否是某个字符串的结尾 struct TrieNode *next[MAXN]; }TrieNode; char s[maxn]; int n,m; TrieNode *proot; TrieNode *CreateTrieNode() { TrieNode *p; p=(TrieNode *)malloc(sizeof(TrieNode)); p->nCount=0; for (int i=0;i<3;i++) p->next[i]=NULL; return p; } void Trie_insert(char *s) //建字典树 { TrieNode *p; p=proot; if (!p) p=proot=CreateTrieNode(); int i=0; while (s[i]) { int k=s[i++]-'a'; if (!p->next[k]) p->next[k]=CreateTrieNode(); p=p->next[k]; } p->nCount=1; } bool dfs(TrieNode *root,int len,int flag) //dfs搜索 { if (s[len]) { int k=s[len]-'a'; if (root->next[k]!=NULL) { if (dfs(root->next[k],len+1,flag)) return true; } if (!flag) { for (int i=0;i<3;i++) if (i!=k&&root->next[i]!=NULL) if (dfs(root->next[i],len+1,++flag)) return true; } } else { if (flag&&root->nCount==1) return true; } return false; } int main() { while (~scanf("%d%d",&n,&m)) { proot=NULL; for (int i=0;i<n;i++) { scanf("%s",s); Trie_insert(s); } for (int i=0;i<m;i++) { scanf("%s",s); if (dfs(proot,0,0)) printf("YES\n"); else printf("NO\n"); } } return 0; }