BZOJ 1212 [HNOI2004]L语言 【AC自动机 + 背包】
题目链接【http://www.lydsy.com/JudgeOnline/problem.php?id=1212】
题意:给你一些单词,然后给出一个没有标点的文本串S,都是小写字符。现在让你求用给出的单词组成文本串T,求S和T的最长公共前缀。
题解:AC自动机 + 背包,背包dp[i],表示是否能组成长度为【1,i】的前缀,在自动机中维护Len[i],表示第i个节点到根节点的距离,End[i],节点i是否是某个单词的结尾。在查询的时候,我们只需要在对应的Trie上跳就可以了,时间复杂度为x * N*log(N)。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1024 * 1024 + 15;
int dp[maxn];
struct Aho_C
{
int Next[maxn][26], Fail[maxn], End[maxn], Len[maxn];
int root, sz;
int newnode()
{
for(int i = 0; i < 26; i++)
Next[sz][i] = -1;
End[sz++] = 0;
return sz - 1;
}
void init()
{
sz = 0;
root = newnode();
}
void Insert(char buf[])
{
int len = strlen(buf);
int now = root;
for(int i = 0; i < len; i++)
{
if(Next[now][buf[i] - 'a'] == -1)
Next[now][buf[i] - 'a'] = newnode();
now = Next[now][buf[i] - 'a'];
Len[now] = i + 1;
}
End[now]++;
}
void Build()
{
queue<int>Q;
Fail[root] = root;
for(int i = 0; i < 26; i++)
if(Next[root][i] == -1)
Next[root][i] = root;
else
{
Fail[Next[root][i]] = root;
Q.push(Next[root][i]);
}
while( !Q.empty() )
{
int now = Q.front();
Q.pop();
for(int i = 0; i < 26; i++)
if(Next[now][i] == -1)
Next[now][i] = Next[Fail[now]][i];
else
{
Fail[Next[now][i]] = Next[Fail[now]][i];
Q.push(Next[now][i]);
}
}
}
void Query(char buf[])
{
int len = strlen(buf + 1);
int now = root;
for(int i = 1; i <= len; i++)
{
dp[i] = 0;
now = Next[now][buf[i] - 'a'];
int temp = now;
int tmp = Len[temp];
while( temp != root)
{
if(End[temp])
{
int pos = i - Len[temp];
dp[i] = max(Len[temp] + dp[pos], dp[i]);
}
temp = Fail[temp];
}
}
}
} ac;
char buf[maxn * 2];
int main()
{
int N, M;
scanf("%d %d", &N, &M);
ac.init();
for(int i = 1; i <= N; i++)
{
scanf("%s", buf);
ac.Insert(buf);
}
ac.Build();
for(int i = 1; i <= M; i++)
{
scanf("%s", buf + 1);
ac.Query(buf);
int len = strlen(buf + 1);
int ma = 0;
for(int i = len; i >= 1; i--)
{
if(dp[i] == i)
{
ma = i;
break;
}
}
printf("%d\n", ma);
}
return 0;
}
BZOJ 1212 [HNOI2004]L语言 【AC自动机 + 背包】的更多相关文章
- BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1367 Solved: 598[Submit][Status ...
- bzoj 1212: [HNOI2004]L语言 AC自动机+状压
为什么这道题网上所有题解写的都是N*Len的trie树的暴力啊,4E的复杂度... 为什么暴力还跑这么快啊TAT.. 有一个O(Len)的做法就是先把AC自动机建出来,因为每个字典串的长度很小,所以我 ...
- BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划
标题效果:给定词的列表,并m串 每个字符串q个最长前缀,这个前缀可满足拆分成一些字符串 这些字符串中存在的词汇太 再也不怕错误的数据范围--有一个很明显Trie树能解决的问题竟然被我写的AC自己主动机 ...
- BZOJ 1212: [HNOI2004]L语言( dp + trie )
因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...
- [HNOI2004] L语言 - AC自动机,dp
给定字典和没有标点的文章,求能够被识别的最长前缀. 显然不能贪心,设\(f[i]\)表示前\(i\)个字符构成的前缀能否被识别,然后在AC自动机上暴力转移即可. 具体来说,每走到一个新位置,就沿着fa ...
- 【bzoj1212】[HNOI2004]L语言 AC自动机
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- bzoj 1212: [HNOI2004]L语言
思路:字典树+dp, dp[ i ] 表示 前缀到 i 能不能被理解, 如果dp[ i ] 是能被理解的那么, 把i + 1, i + 2 .... 在字典树上走,走到一个单词就转移. ,这样可行的 ...
- BZOJ 1212: [HNOI2004]L语言 trie
长度小于 10 是关键信息~ #include <cstdio> #include <cstring> #include <algorithm> #define N ...
- 1212: [HNOI2004]L语言
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 643 Solved: 252[Submit][Status] ...
随机推荐
- 下拉框 select
1.select 用来做什么? select 用于实现下来下拉列表,其 html 结构是这样的: <select name="city" id="city" ...
- css_清除浮动的4种方式
浮动布局和定位布局为css中布局的常用的两种布局方式,而且兼容性会比较好.随着flex的流行,以后会是主流,新的东西好用,兼容不太好.IE10以下不兼容flex布局. float布局会脱离文档流,对页 ...
- ubuntu16.04 eclipse+pydev 配置
参考:http://blog.csdn.net/bluish_white/article/details/56509446,http://blog.csdn.net/qing101hua/articl ...
- 彻底搞懂字符编码(unicode,mbcs,utf-8,utf-16,utf-32,big endian,little endian...)[转]
最近有一些朋友常问我一些乱码的问题,和他们交流过程中,发现这个编码的相关知识还真是杂乱不堪,不少人对一些知识理解似乎也有些偏差,网上百度, google的内容,也有不少以讹传讹,根本就是错误的(例如说 ...
- linux sigaction 函数 用法释义
使用 sigaction 函数: signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX 标准定义的信号处 ...
- 打包egg
scrapyd-deploy -p chahao -v 1.0 --build-egg chahao.egg
- SQL 存储过程分页
CREATE PROC p_Team_GetTemaList @pageindex INT , @pagesize INT , @keywords VARCHAR(200) , --模糊查询 名称 标 ...
- 数据结构之 栈 (Python 版)
数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 class SStack(): ''' 基于顺序表 实现的 栈类 ''' def __init__ ...
- Java基础83 JSP标签及jsp自定义标签(网页知识)
1.JSP标签 替代jsp脚本,用于jsp中执行java代码1.1.内置标签: <jsp:forward></jsp:forward> 相当于:request.getReu ...
- java基础61 JavaScript循环语句之while、do...while、for及for...in循环(网页知识)
本文知识点(目录): 1.while循环语句 2.do...while循环语句 3.for循环语句 4.for...in循环语句 5.附录1(with语句) 6.附录2( ...