首页 > 其他 > 详细

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

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

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自动机模板

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!