HDU 2222

HDU 2222

#include <queue>
#include <iostream>
#include <string.h>
using namespace std;

#define MAX_N 1000006
#define MAX_Tot 500005

struct Aho{
	struct state{
		int next[26];
		int fail,cnt;	
	}stataTable[MAX_Tot];
	
	int size;
	queue<int> que;
	
	void init()
	{
		for(int i=0;i<MAX_Tot;i++)
		{
			memset(stataTable[i].next,0,sizeof(stataTable[i].next));
			stataTable[i].fail=stataTable[i].cnt=0;
		}
		size=1;
	}
	
	void insert(char *S)
	{
		int n=strlen(S);
		int now=0;
		for(int i=0;i<n;i++)
		{
			char c=S[i];
			if(!stataTable[now].next[c-'a'])
			{
				stataTable[now].next[c-'a']=size++;
			}
			now=stataTable[now].next[c-'a'];
		 } 
		 stataTable[now].cnt++;
	}
	
	void build()
	{
		stataTable[0].fail=-1;
		que.push(0);
		
		while(que.size())
		{
			int u=que.front();
			que.pop();
			for(int i=0;i<26;i++)
			{
				if(stataTable[u].next[i])
				{
					if(u==0)
					{
						stataTable[stataTable[u].next[i]].fail=0;
					}
					else
					{
						int v=stataTable[u].fail;
						while(v!=-1)
						{
							if(stataTable[v].next[i])
							{
								stataTable[stataTable[u].next[i]].fail=stataTable[v].next[i];
								break;
							}
							v=stataTable[v].fail;
						}
						if(v==-1)
						{
							stataTable[stataTable[u].next[i]].fail=0;
						}
					}	
					que.push(stataTable[u].next[i]);
				}
			}
		}
	}
	
	int Get(int u)
	{
		int res=0;
		while(u)
		{
			res=res+stataTable[u].cnt;
			stataTable[u].cnt=0;
			u=stataTable[u].fail;
		}
		return res;
	}
	
	int match(char *S)
	{
		int n=strlen(S);
		int res=0,now=0;
		for(int i=0;i<n;i++)
		{
			char c=S[i];
			if(stataTable[now].next[c-'a'])
			{
				now=stataTable[now].next[c-'a'];
			}
			else
			{
				int p=stataTable[now].fail;
				while(p!=-1&&stataTable[p].next[c-'a']==0)
				{
					p=stataTable[p].fail;
				}
				if(p==-1)
				{
					now=0;
				}
				else
				{
					now=stataTable[p].next[c-'a'];
				}
			}
			if(stataTable[now].cnt)
			{
				res=res+Get(now);
			}
		}
		return res;
	}
}aho;

int T,N;
char S[MAX_N];
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		aho.init();
		scanf("%d",&N);
		for(int i=0;i<N;i++)
		{
			scanf("%s",S);
			aho.insert(S);
		 } 
		 aho.build();
		 scanf("%s",S);
		 printf("%d
",aho.match(S));
	}
	return 0;
}

HDU 2896

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;

struct Aho{
	struct Node{
		int next[128];
		int fail,cnt;
	}state[maxn];
	
	int size,k;
	queue<int> q;
	
	void init()
	{
		size =1 ;
		k=0;
//		for(int i=0;i<maxn;i++)
//		{
////			memset(state[i].next,0,sizeof(state[i].next));
//			state[i].cnt=state[i].fail=0;
//		}
		
	}
	
	void insert(char *S,int num)
	{
		int len=strlen(S);
		int now=0;
		for(int i=0;i<len;i++)
		{
			char c=S[i];
			if(!state[now].next[c])
			{
				state[now].next[c]=size++;
			}
			now=state[now].next[c];
		}
		state[now].cnt=num;
	}
	
	void build()
	{
		state[0].fail=-1;
		q.push(0);
		while(!q.empty())
		{
			int u=q.front();
			q.pop();
			for(int i=0;i<128;i++)
			{
				if(state[u].next[i])
				{
					if(u==0)
					{
						state[state[u].next[i]].fail=0;
					}
					else
					{
						int v=state[u].fail;
						while(v!=-1)
						{
							if(state[v].next[i])
							{
								state[state[u].next[i]].fail=state[v].next[i];
								break;
							}
							v=state[v].fail;
						}
						if(v==-1)
						{
							state[state[u].next[i]].fail=0;
						}
					}
					q.push(state[u].next[i]);
				}			
			}
		}
	}
	
	int ans[1005];
	
	void get(int now)
	{
		while(now)
		{
			if(state[now].cnt)
			{
				ans[k++]=state[now].cnt;
//				state[now].cnt=0;
			}
			now=state[now].fail;
		 } 
	}
	
	int marry(char *S)
	{
		int len=strlen(S);
		int now=0;
		for(int i=0;i<len;i++)
		{
			char c=S[i];
			if(state[now].next[c])
			{
				now=state[now].next[c];
			}
			else
			{
				int p=state[now].fail;
				while(p!=-1&&state[p].next[c]==0)
				{
					p=state[p].fail;
				}
				if(p==-1)
				{
					now=0;
				}
				else
				{
					now=state[p].next[c];
				}
			}
			if(state[now].cnt)
			{
				get(now);
			}
		}
		
	}
	
}aho;

int n,m;
char s[205],ss[10005];

int main()
{
	aho.init();
	int sum=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",s);
		aho.insert(s,i);	
	}	
	aho.build();
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		aho.ans[0]=0;
		scanf("%s",ss);
		aho.marry(ss);
		sort(aho.ans,aho.ans+aho.k);
		if(aho.ans[0])
		{
			printf("web %d:",i);
			for(int j=1;j<=aho.k;j++)
			{
				if(aho.ans[j]==aho.ans[j-1])
				{
					continue;
				}
				else
					printf(" %d",aho.ans[j-1]);
			}
			printf("
");
			++sum;
		}
		aho.k=0;
	}
	printf("total: %d
",sum);
	return 0;
 } 

HDU 3605

#include<bits/stdc++.h>
using namespace std;

const int maxn=5e4+5;
const int maxx=2e6+6;

struct Aho{
	struct Node{
		int next[26];
		int fail,cnt;
	}state[maxn];
	
	int size;
	queue<int> q;
	
	void init()
	{
		for(int i=0;i<maxn;i++)
		{
			memset(state[i].next,0,sizeof(state[i].next));
			state[i].fail=state[i].cnt=0;
		}
		size = 1;
	}
	
	void insert(char *s,int num)
	{
		int len=strlen(s);
		int now=0;
		for(int i=0;i<len;i++)
		{
			char c=s[i];
			if(!state[now].next[c-'A'])
			{
				state[now].next[c-'A']=size++;
			}
			now=state[now].next[c-'A'];
		}
		state[now].cnt=num;
	}
	
	void build()
	{
		state[0].fail=-1;
		q.push(0);
		while(!q.empty())
		{
			int u=q.front();
			q.pop();
			for(int i=0;i<26;i++)
			{
				if(state[u].next[i])
				{
					if(u==0)
					{
						state[state[u].next[i]].fail=0;
					}
					else
					{
						int v=state[u].fail;
						while(v!=-1)
						{
							if(state[v].next[i])
							{
								state[state[u].next[i]].fail=state[v].next[i];
								break;
							}
							v=state[v].fail;
						}
						if(v==-1)
						{
							state[state[u].next[i]].fail=0;
						}
					}
					q.push(state[u].next[i]);
				}
			}
		}
	}
	
	int sum[1005];
	
	void get(int now)
	{
		while(now)
		{
			if(state[now].cnt)
			{
				sum[state[now].cnt]++;
			}	
			now=state[now].fail;
		}	
	}
	
	void match(char *s)
	{
		int len=strlen(s);
		int now=0;
		for(int i=0;i<len;i++)
		{
			char c=s[i];
			if(state[now].next[c-'A'])
			{
				now=state[now].next[c-'A'];
			}
			else
			{
				int p=state[now].fail;
				while(p!=-1&&state[p].next[c-'A']==0)
				{
					p=state[p].fail;
				}
				if(p==-1)
				{
					now=0;
				 } 
				 else
				 {
				 	now=state[p].next[c-'A'];
				 }
			}
			if(state[now].cnt)
			{
				get(now);
			}
		}
	}
}aho;

char s[1005][55];
char ss[maxx];
char sss[maxx];

int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		aho.init();
		memset(aho.sum,0,sizeof(aho.sum));
		for(int i=1;i<=n;i++)
		{
			scanf("%s",s[i]);
			aho.insert(s[i],i);
		}
		aho.build();
		scanf("%s",ss);
		int len=strlen(ss);
		int k=0;
		for(int i=0;i<=len;i++)
		{
			if(ss[i]>='A'&&ss[i]<='Z')
			{
				sss[k++]=ss[i];
			}
			else
			{
				sss[k]='';
				aho.match(sss);
				k=0;
			}
		}
		for(int i=1;i<=n;i++)
		{
			if(aho.sum[i]) 
			{
				printf("%s: %d
",s[i],aho.sum[i]);
			}
		}
	}
	
	return 0;
}
原文地址:https://www.cnblogs.com/tianming1/p/11594145.html