BZOJ1212: [HNOI2004]L语言 AC自动机

原创 2017年03月24日 20:24:28

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1212

把给定的单词建成一个AC自动机,然后把给的文章在上面跑即可。

f[i]表示能不能匹配到第i个字符,当第i个字符在AC自动机上走到了x节点,如果x是一个danger节点那么就一直跳x的fail指针,如果路径上有danger节点,f[i]|=f[i-w[x]] (其中w[x]表示:如果x为终止节点那么这个字符串的长度是多少)

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int M=1000005;
const int N=1005;
int n,m,f[M],e[N][30],fail[N],cnt=1,w[N];
char s[M],ch[30];
bool danger[N];
void insert()
{
	scanf("%s",ch+1);
	int x=1;
	for(int i=1;ch[i];i++)
	{
		int o=ch[i]-'a'+1;
		if(!e[x][o]) e[x][o]=++cnt;
		x=e[x][o];
	}
	w[x]=strlen(ch+1);
	danger[x]=true;
}
queue<int>Q;
void build()
{
	for(int i=1;i<=26;i++) e[0][i]=1;
	fail[1]=0;
	Q.push(1);
	while(!Q.empty())
	{
		int x=Q.front();
		Q.pop();
		for(int i=1;i<=26;i++)
		{
			int v=e[x][i];
			if(v) fail[v]=e[fail[x]][i],Q.push(v);
			else e[x][i]=e[fail[x]][i];
		}
		danger[x]|=danger[fail[x]];
	}
}
void match()
{
	int x=1;
	for(int i=1;s[i];i++)
	{
		int o=s[i]-'a'+1;
		x=e[x][o];
		if(danger[x])
		{
			int y=x;
			while(y)
			{
				if(w[y]) f[i]|=f[i-w[y]];
				y=fail[y];
			}
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) insert();
	build();
	while(m--)
	{
		scanf("%s",s+1);
		int len=strlen(s+1);
		memset(f,0,sizeof(f));
		f[0]=1;
		match();
		for(int i=len;i>=0;i--)
		if(f[i]) {printf("%d\n",i);break;}
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

BZOJ 1212: [HNOI2004]L语言 AC自动机

Description标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。 一段文章T是由若干小写字母构成。一个单词W也是由若干小写字母构成。一个字典D是...

BZOJ 1212 HNOI2004 L语言 AC自动机(Trie树)+动态规划

题目大意:给定一个单词表和m个字符串 问每个字符串的最长的前缀,满足这个前缀可以拆分成一些字符串 使这些字符串都在单词表中出现过 再也不敢看错数据范围了……一道明明用Trie树能解决的问题居然被我写...

【BZOJ】【P1212】【HNOI2004】【L语言】【题解】【dp】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1212

大视野1212--[HNOI2004]L语言(Trie+DP)

Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。 一段文章T是由若干小写字母构成。一个单词W也是由若干小写字母构成。一个...

[bzoj 1009] [HNOI2008]GT考试:DP,单串AC自动机,矩阵快速幂

题意:给一个长为M(M<=20)的十进制数字串,求有多少个长为N(N<=10^9)的十进制数字串不包含它,结果对K(K<=10^3)取模。 在黄学长博客的KMP分类中找到这题。并没产生什么好思路……准...

BZOJ 1009 [HNOI2008]GT考试 AC自动机+矩阵乘法

BZOJ 1009 [HNOI2008]GT考试 AC自动机+矩阵乘法

【BZOJ1009】【HNOI2008】GT考试 AC自动机+矩阵乘法

#Demacia

BZOJ1212——L语言

题目大意:每一个字符串都可以分解成一些个单词组成,现在给你一些单词,再给你一个字符串, dp吧,设f[i]为从0开始,到i结束的字符串前缀是否可以被分解,因为单词长度很小,所以,这就T了, (什么...

[HNOI2004]L语言

题目描述标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。一段文章T是由若干小写字母构成。一个单词W也是由若干小写字母构成。一个字典D是若干个单词的集合...

【BZOJ3172】【Tjoi2013】单词 AC自动机模板题

题解:水爆了,直接AC自动机瞎写就行。 坑:……时隔一个半月的感动AC,竟然是因为这道题可以有重复单词233。 代码: #include #include #include #include...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)