poj 1816
trie树上的搜索,数据太阴了,模式串有重复的。
代码:
#include<iostream> #include<fstream> using namespace std; struct e{ int a; e *next; }; struct { int p[60]; e end; }trie[600001]; int m,n; int hash[128]; int state=1; long long s; int v[100001]; int f; void build(char c[]){ int i,j=0,k; for(i=1;;) { if(trie[i].p[hash[c[j]]]==0) trie[i].p[hash[c[j]]]=++state; i=trie[i].p[hash[c[j]]]; j++; if(j>=strlen(c)) break; } e *w= new e; w->a=f++; w->next=(trie[i].end).next; (trie[i].end).next=w; } void solve(int s,int t,char c[]){ int i,j,k; if(s>=strlen(c)) { e *w=(trie[t].end).next; while(w) { v[w->a]=1; w=w->next; } while(trie[t].p[0]>0) { t=trie[t].p[0]; e *w=(trie[t].end).next; while(w) { v[w->a]=1; w=w->next; } } return; } if(trie[t].p[0]>0) { for(i=s;i<=strlen(c);i++) solve(i,trie[t].p[0],c); } if(hash[c[s]]!=-1&&trie[t].p[hash[c[s]]]>0) solve(s+1,trie[t].p[hash[c[s]]],c); if(trie[t].p[1]>0) solve(s+1,trie[t].p[1],c); } void read(){ // ifstream cin("in.txt"); long long i,j,k; char c[27]; cin>>s>>m; memset(hash,-1,sizeof(hash)); hash['?']=1; hash['*']=0; n=1; for(i=1;i<=s;i++) { cin>>c; for(j=0;j<strlen(c);j++) if(hash[c[j]]==-1) hash[c[j]]=++n; build(c); } for(i=1;i<=m;i++) { cin>>c; memset(v,0,sizeof(v)); solve(0,1,c); j=0; for(k=0;k<s;k++) if(v[k]) { j=1; cout<<k<<' '; } if(j) cout<<endl; else cout<<"Not match"<<endl; } } int main(){ read(); return 0; }