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;}
	}
}


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

【bzoj4327】【JSOI2012】【玄武密码】【AC自动机】

Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河。相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中。老人们说,这是玄武神灵将天书藏匿在此...

[BZOJ4861][Beijing2017]魔法咒语 AC自动机+动态规划+矩阵快速幂

对忌讳词语构建AC自动机 Fi,jF_{i,j}表示长度为ii,匹配到AC自动机第jj位的合法串方案数 当状态数少的时候用矩阵转移#include #define N 5050 const in...

BZOJ_P3172 [Tjoi2013]单词(AC自动机)

BZOJ传送门Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2496 Solved: 1163 [Submit][Status][Discus...

bzoj 4327: JSOI2012 玄武密码 (AC自动机)

4327: JSOI2012 玄武密码 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 204  Solved: 85 [Submit][Status...

【bzoj3940】[Usaco2015 Feb]Censoring AC自动机

同3942,把KMP换成AC自动机。 开一个栈,记录一下每个位置匹配到哪个节点,如果是单词节点,那么弹出对应长度的字符串。 #include #include #include #incl...

bzoj 3940(ac自动机)

3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 157  Solved: 82 [...
  • M_AXSSI
  • M_AXSSI
  • 2016年03月03日 20:52
  • 296

[BZOJ4327]JSOI2012 玄武密码(AC自动机)

题目描述传送门题解将小串离线然后建立AC自动机 大串在自动机上直接匹配,能匹配的点标1 然后对于每一个点,如果它能匹配,那么它fail指向的点也能匹配 传递一下标记 然后对于每一个小串再查询一...

BZOJ3271【AC自动机】

/* I will wait for you */ #include #include #include #include #include #include #include #include #...

bzoj 3530: [Sdoi2014]数数 AC自动机&动态规划

构建幸运数的AC自动机。令dp[i][j][k]表示匹配到n的第i位,在AC自动机的第j位,状态为k的方案。其中状态定义如下:        k=0表示前i为比n的前i位小;k=1为相等;k=2为大于...

(带讲解)bzoj1030 AC自动机+dp

第一道AC自动机上的dp题意是给出一些字符串,求长为m的字符串包含这些的一共有多少个,字符集A-Z首先运用补集转换,转而求不含这些串的个数,最后用26^M减掉就行根据输入的字符串建立AC自动机dp[i...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ1212: [HNOI2004]L语言 AC自动机
举报原因:
原因补充:

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