[BZOJ1212][HNOI2004]L语言(AC自动机+dp)
来源:互联网 发布:淘宝小样正品店 编辑:程序博客网 时间:2024/06/11 04:14
题目描述
传送门
题解
这道题我开始就想到了暴力,但是算一算时间复杂度是
但是上网查了一下题解发现大家好像都是用的很暴力的方法,并且还有人说20*10*1M轻松过我也不知道是为什么1M不应该是
dp的思路非常好想,就是f(i)表示前i个是不是合法的串,可以知道如果位置i减去任何一个后缀如果是合法的那f(i)一定是合法的,那么就建立AC自动机暴力匹配暴力蹦失配就可以了。
一次匹配的时间是1M,由于树的深度是10,所以总时间复杂度为
代码
#include<iostream>#include<cstring>#include<cstdio>#include<queue>using namespace std;#define N 205#define S 1100000char s[S];int n,m,len,sz;bool f[S];int ch[N][30],fail[N],is_end[N];queue <int> q;void insert(){ int len=strlen(s),now=0; for (int i=0;i<len;++i) { int x=s[i]-'a'; if (!ch[now][x]) ch[now][x]=++sz; now=ch[now][x]; } is_end[now]=len;}void make_fail(){ while (!q.empty()) q.pop(); for (int i=0;i<26;++i) if (ch[0][i]) q.push(ch[0][i]); while (!q.empty()) { int now=q.front();q.pop(); for (int i=0;i<26;++i) { if (!ch[now][i]) { ch[now][i]=ch[fail[now]][i]; continue; } fail[ch[now][i]]=ch[fail[now]][i]; q.push(ch[now][i]); } }}void ac(){ int now=0; for (int i=0;i<len;++i) { int x=s[i]-'a'; int y=ch[now][x]; while (y) { f[i+1]|=f[i+1-is_end[y]]; y=fail[y]; } now=ch[now][x]; }}int main(){ scanf("%d%d\n",&n,&m); for (int i=1;i<=n;++i) { gets(s); insert(); } make_fail(); for (int i=1;i<=m;++i) { gets(s);len=strlen(s); memset(f,0,sizeof(f));f[0]=1; ac(); for (int i=len;i>=0;--i) if (f[i]) { printf("%d\n",i); break; } }}
0 0
- [DP+AC自动机] BZOJ1212: [HNOI2004]L语言
- [BZOJ1212][HNOI2004]L语言(AC自动机+dp)
- bzoj1212 [HNOI2004]L语言(AC+dp)
- BZOJ1212: [HNOI2004]L语言 AC自动机
- [bzoj1212] [HNOI2004]L语言(trie+dp)
- bzoj 1212: [HNOI2004]L语言(AC自动机+DP)
- bzoj1212: [HNOI2004]L语言 Trie+dp
- [BZOJ1212]-[HNOI2004]L语言-trie+DP
- bzoj1212: [HNOI2004]L语言
- 【BZOJ1212】【HNOI2004】L语言
- bzoj1212: [HNOI2004]L语言
- bzoj1212: [HNOI2004]L语言
- bzoj1212: [HNOI2004]L语言
- bzoj1212 [HNOI2004]L语言(Trie+暴力)
- BZOJ 1212 [HNOI2004] L语言 AC自动机+DP
- Bzoj 1212: [HNOI2004]L语言(AC自动机+DP)
- BZOJ 1212: [HNOI2004]L语言 AC自动机
- 【BZOJ1212】[HNOI2004]L语言【Trie】【暴力】
- Java编程入门程序实践
- 大数据平台搭建(hadoop+spark)
- 网络问题导致Rstudio正确安装包
- 5-5 设计一个表示拥护的User类
- 文章标题
- [BZOJ1212][HNOI2004]L语言(AC自动机+dp)
- oracle存储过程笔记
- 用AW国际版激活国行moto二代
- 修改Ubuntu的apt-get源为阿里源的方法
- Java学习笔记2
- [AHK]监控某些窗口出现时点击某些按钮
- Spring MVC 教程,快速入门,深入分析
- 阿里无线前端性能优化指南 (Pt.1 加载优化)
- Linux系统管理——用户权限管理