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;
}
浙公网安备 33010602011771号