AC自己主动机模板(数组实现版)

BY 九野

做了一道题,用我的那种写法华丽丽的超时了。,无奈学一学数组实现的

#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
const int  maxnode=250*1000+10000;//maxnode=单词数*单词长度+常数
const int sg_size=26;
struct Trie
{
	int ch[maxnode][sg_size];
	int val[maxnode];//该单词在模式串出现的次数
	int last[maxnode];
	int f[maxnode];//失配函数
	int num[maxnode];//该单词在文本串中出现的次数
	int pre[maxnode];//该单词的前驱
	int len[maxnode];//以该单词结尾的单词长度
	int Char[maxnode];//该单词相应的字母
	int road[maxnode];//路径压缩优化,针对模式串出现的种类
	int sz;
	int newnode()
	{
		val[sz]=f[sz]=last[sz]=len[sz]=num[sz]=0;
		memset(ch[sz],0,sizeof(ch[sz]));
		return sz++;
	}
	void init()
	{
		sz=0;
		newnode();
	}
	int idx(char c)
	{
		return c-'A';
	}
	int insert(char *s)
	{
		int u=0,i;
		for(i=0;s[i];i++)
		{
			int c=idx(s[i]);
			if(!ch[u][c])
				ch[u][c]=newnode();
			pre[ch[u][c]]=u;
			Char[ch[u][c]]=s[i];
			len[ch[u][c]]=len[u]+1;
			road[ch[u][c]]=1;
			u=ch[u][c];
		}
		val[u]=1;
		num[u]=0;
		return u;
	}
	void getfail()
	{
		queue<int>q;
		int i;
		for(i=0;i<sg_size;i++)
		{
			if(ch[0][i])
				q.push(ch[0][i]);
		}
		int r,c,u,v;
		while(!q.empty())
		{
			r=q.front();
			q.pop();
			for(c=0;c<sg_size;c++)
			{
				u=ch[r][c];
				if(u)
					continue;
				q.push(u);
				v=f[r];
				while(v&&ch[v][c]==0)
					v=f[v];//沿失配边走上去 假设失配后有节点 且 其子节点c存在则结束循环
				f[u]=ch[v][c];
			}
		}
	}
	void find(char *s)
	{ //计算模式串出现的个数:(每种多次出现算多次)
		int j=0;
		for(int i=0;s[i];i++)
		{
			int c=idx(s[i]);
			while(j&&ch[j][c]==0)
				j=f[j];
			j=ch[j][c];
			int temp=j;
			while(temp)
			{
				num[temp]++;
				temp=f[temp];
			}
		}
	}
	void find_kind(char *s,int &ans)
	{
		//计算种数, 反复出现的不再计算(若多个询问则要在此处加for(i=0->sz)lu[i]=1;
		int j=0,i,c,temp;
		for(i=0;s[i];i++)
		{
			c=idx(s[i]);
			while(j&&ch[j][c]==0)
				j=f[j];
			j=ch[j][c];
			temp=j;
			while(temp&&road[temp])
			{
				if(val[temp])
				{
					++ans;
					val[temp]=0;
				}
				road[temp]=0;
				temp=f[temp];
			}
		}
	}
}ac;
int main()
{

}
时间: 2024-10-09 07:08:14

AC自己主动机模板(数组实现版)的相关文章

AC自己主动机模板

AC自己主动机模板-- /* * AC自己主动机模板 * 用法: * 1.init() : 初始化函数 * 2.insert(str) : 插入字符串函数 * 3.build() : 构建ac自己主动机 * 4.query(str) : 返回出现的字符串个数 * * 使用需注意事项: * 1.注意输入的字符的范围,需对Next和其二维大小及相关參数进行更改 * 2.注意Next.Fail和End数组的大小,防止超内存过数组越界 * 3.依据实际情况对模板中" buf[i] - 'a' "

HDU 2222 Keywords Search(AC自己主动机模板题)

题意:给出一个字符串和若干个模板,求出在文本串中出现的模板个数. 思路:由于有可能有反复的模板,trie树权值记录每一个模板出现的次数就可以. #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map&

字符串算法之 AC自己主动机

近期一直在学习字符串之类的算法,感觉BF算法,尽管非常easy理解,可是easy超时,全部就想学习其它的一些字符串算法来提高一下,近期学习了一下AC自己主动机.尽管感觉有所收获,可是还是有些朦胧的感觉,在此总结一下,希望大家不吝赐教. 一.AC自己主动机的原理: Aho-Corasick automaton.该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之中的一个. 一个常见的样例就是给出N个单词,在给出一段包括m个字符的文章,让你找出有多少个单词在这文章中出现过,.要搞懂AC自己主动

ZOJ 3228 Searching the String (AC自己主动机)

题目链接:Searching the String 解析:给一个长串.给n个不同种类的短串.问分别在能重叠下或者不能重叠下短串在长串中出现的次数. 能重叠的已经是最简单的AC自己主动机模板题了. 不能重叠的记录一下每一个匹配的串的起始位置保证不重叠就可以. AC代码: #include <bits/stdc++.h> using namespace std; struct Trie{ int next[600010][26], fail[600010], deep[600010]; int r

数据结构与算法系列----AC自己主动机

一:概念 首先简要介绍一下AC自己主动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之中的一个.一个常见的样例就是给出n个单词,再给出一段文章(长度是m),让你找出有多少个单词在文章里出现过. 要搞懂AC自己主动机.先得有字典树Trie的基础知识(也有人说需要KMP的知识,我认为暂且不要理会这个. 可是在看这篇文章之前,Trie字典树,你是必需要先搞懂,假设你还不理解Trie,请參考http://blog.csdn.net/laoji

【UVA】1449-Dominating Patterns(AC自己主动机)

AC自己主动机的模板题.须要注意的是,对于每一个字符串,须要利用map将它映射到一个结点上,这样才干按顺序输出结果. 14360841 1449 option=com_onlinejudge&Itemid=8&page=show_problem&problem=4195" style="font-size:13.3333330154419px; margin:0px; padding:0px; color:rgb(153,0,0); text-decoratio

zoj 3430 Detect the Virus(AC自己主动机)

Detect the Virus Time Limit: 2 Seconds      Memory Limit: 65536 KB One day, Nobita found that his computer is extremely slow. After several hours' work, he finally found that it was a virus that made his poor computer slow and the virus was activated

[POJ 1204]Word Puzzles(Trie树暴搜&amp;amp;AC自己主动机)

Description Word puzzles are usually simple and very entertaining for all ages. They are so entertaining that Pizza-Hut company started using table covers with word puzzles printed on them, possibly with the intent to minimise their client's percepti

POJ 3691 &amp;amp; HDU 2457 DNA repair (AC自己主动机,DP)

http://poj.org/problem?id=3691 http://acm.hdu.edu.cn/showproblem.php?pid=2457 DNA repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5690   Accepted: 2669 Description Biologists finally invent techniques of repairing DNA that contain