标签:flag nbsp cout return out 题意 amp using name
题意:
给n个模式串,m个匹配串,问是否有只与匹配串相差一个字符的模式串
思路:
直接上Tire,正常插入模式串
匹配时往该节点的儿子节点进行正常匹配,若能匹配成功,就输出YES
#include<iostream> #include<algorithm> #include<cstring> #include<string> using namespace std; const int maxn=1e6+10; int n,m; struct Tire{ int ch[maxn][3],val[maxn],cnt; void init() { cnt=1; memset(ch,0,sizeof(ch)); val[0]=0; } void insert(string s){ int u=0,n=s.length(); for(int i=0;i<n;i++){ int c=s[i]-‘a‘; if(!ch[u][c]) ch[u][c]=cnt++; u=ch[u][c]; } val[u]=cnt; } bool query(string s){ int u=0,n=s.length(),flag,k; for(int i=0;i<n;i++){ int c=s[i]-‘a‘; for(int j=0;j<=2;j++){ if(c==j||ch[u][j]==0) continue; int x=ch[u][j]; flag=1; for(int k=i+1;k<n;k++){ int y=s[k]-‘a‘; if(!ch[x][y]){ flag=0; break; } x=ch[x][y]; } if(flag&&val[x]) return true; } if(!ch[u][c]) return false; u=ch[u][c]; } return false; } }T; int main() { string temp; scanf("%d%d",&n,&m); T.init(); for(int i=1;i<=n;i++){ cin>>temp; T.insert(temp); } for(int i=1;i<=m;i++){ cin>>temp; if(T.query(temp)) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
Codefoces514C - Watto and Mechanism(Tire)
标签:flag nbsp cout return out 题意 amp using name
原文地址:https://www.cnblogs.com/overrate-wsj/p/12364387.html