码迷,mamicode.com
首页 > 其他好文 > 详细

【字符串匹配】AC自动机模板

时间:2014-12-06 15:16:58      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:blog   ar   for   on   div   log   amp   as   tt   

AC自动机

struct ACauto
{
	int ch[MAXN][26];
	int size;
	int f[MAXN],last[MAXN],val[MAXN],cnt[MAXN];
	
	void init()//初始化
	{
		size=1;
		memset(ch[0],0,sizeof(ch[0]));
		memset(cnt,0,sizeof(cnt)); //用于统计配对数
	}
	
	int idx(char c)//用于返回编号
	{
		return c-‘a‘;
	}
	
	void insert(char *s,int v)//将字符串s插入字典树中,其中v是字符串的编号
	{
		int u=0,len=strlen(s);
		for (int i=0;i<len;i++)
		{
			int c=idx(s[i]);
			if (!ch[u][c])
			{
				memset(ch[size],0,sizeof(ch[size]));
				val[size]=0;
				ch[u][c]=size++;
			}
			u=ch[u][c];
		}
		val[u]=v;//在字符串末尾做出标记,标记为字符串的编号i
	}
	
	void print(int j)//用于输出处理
	{
		if (j)
		{
			cnt[val[j]]++;//成功配对数加1
			print(last[j]);
		}
	}
	
	int getFail()//构造失配函数
	{
		queue <int> q;
		f[0]=0;
		for (int c=0;c<26;c++)
		{
			int u=ch[0][c];
			if (u)
			{
				f[u]=0;
				q.push(u);
				last[u]=0;
			}
		}
		
		while (!q.empty())
		{
			int r=q.front(); q.pop();
			for (int c=0;c<26;c++)
			{
				int u=ch[r][c];
				if (!u) 
				{
					ch[r][c]=ch[f[r]][c];
					continue;
				}
				q.push(u);
				int v=f[r];
				f[u]=ch[v][c];
				last[u]=val[f[u]]?f[u]:last[f[u]];
			}
		}
	}
				
	
	void find(char *T)//AC自动机主函数
	{
		int n=strlen(T);
		int j=0;
		for (int i=0;i<n;i++)
		{
			int c=idx(T[i]);
			while(j&&!ch[j][c]) j=f[j];
			j=ch[j][c];
			if (val[j]) print(j);
			else if (last[j]) print(last[j]);
		}
	}
}ac;

  

【字符串匹配】AC自动机模板

标签:blog   ar   for   on   div   log   amp   as   tt   

原文地址:http://www.cnblogs.com/zhyfzy/p/4148186.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!