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;
}

posted on 2011-03-09 17:14  宇宙吾心  阅读(346)  评论(0)    收藏  举报

导航