zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    关于虚函数那点破事
    两个分析HTML网页的方法
    C#实现web信息自动抓取
    ASP:打造内容管理系统之模板技术乱谈
    猪的FLASH-大肚腩
    猪的FLASH-深呼吸
    ASP.NET正则对象初看。
    今天搜索了一下堕落的卖猪贩一词。
    个人形象Show-卡通图
    检测远程URL是否存在的三种方法
  • 原文地址:https://www.cnblogs.com/tianming1/p/11594145.html
Copyright © 2011-2022 走看看