【BZOJ1212】L语言(AC自动机)

题面

BZOJ

题解

很自然的,既然要匹配单词,那就全部都丢到\(AC\)自动机里面去

现在想想怎么匹配

先是\(AC\)自动机正常的匹配

如果此时这个位置能够匹配上一个串

我们就需要判断一下这个串覆盖到这个文本串中

它的前一位是否恰好被覆盖

如果有的话

我们也不能直接计算

因为可能是其他不同的串拼起来的

所以,就开一个数组差分

表示当前位置可以匹配

最后,对于每个文本串

从前往后扫一遍差分数组

直到有\(0\)的地方就直接输出就行啦

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Node
{
int vis[26];
int dep,lst,fail;
}t[5000];
int n,m,tot;
char s[2000000];
int cc[2000000];
bool vis[2000000];
void insert(char *s)
{
int l=strlen(s+1),now=0;
for(int i=1;i<=l;++i)
{
if(!t[now].vis[s[i]-97])
t[now].vis[s[i]-97]=++tot;
now=t[now].vis[s[i]-97];
t[now].dep=i;
}
t[now].lst=1;
}
void GetFail()
{
queue<int> Q;
for(int i=0;i<26;++i)
if(t[0].vis[i])Q.push(t[0].vis[i]);
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=0;i<26;++i)
if(t[u].vis[i])
t[t[u].vis[i]].fail=t[t[u].fail].vis[i],Q.push(t[u].vis[i]);
else t[u].vis[i]=t[t[u].fail].vis[i];
}
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)
{
scanf("%s",s+1);
insert(s);
}
GetFail();
while(m--)
{
scanf("%s",s+1);
int l=strlen(s+1);
int lst=0,now=0;
memset(cc,0,sizeof(cc));
memset(vis,0,sizeof(vis));
vis[0]=true;
for(int i=1;i<=l;++i)
{
now=t[now].vis[s[i]-97];
for(int j=now;j;j=t[j].fail)
if(t[j].lst&&vis[i-t[j].dep])
{
vis[i]=true;
cc[i-t[j].dep+1]++;
cc[i+1]--;
}
}
for(int i=1,tot=0;i<=l;++i)
{
tot+=cc[i];
if(tot)++lst;else break;
}
printf("%d\n",lst);
}
return 0;
}

【BZOJ1212】L语言(AC自动机)的更多相关文章

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

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  2. bzoj 1212: [HNOI2004]L语言 AC自动机+状压

    为什么这道题网上所有题解写的都是N*Len的trie树的暴力啊,4E的复杂度... 为什么暴力还跑这么快啊TAT.. 有一个O(Len)的做法就是先把AC自动机建出来,因为每个字典串的长度很小,所以我 ...

  3. [HNOI2004] L语言 - AC自动机,dp

    给定字典和没有标点的文章,求能够被识别的最长前缀. 显然不能贪心,设\(f[i]\)表示前\(i\)个字符构成的前缀能否被识别,然后在AC自动机上暴力转移即可. 具体来说,每走到一个新位置,就沿着fa ...

  4. 【bzoj1212】[HNOI2004]L语言 AC自动机

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

  5. [bzoj1212][HNOI2004]L语言_AC自动机_动态规划

    L语言 bzoj-1212 HNOI-2004 题目大意:给你一个n个单词的集合,然后给你m条字符串.问每条字符串可以被理解的最长前缀.被理解当且仅当存在一种分割使得每一段都是集合里的元素. 注释:$ ...

  6. BZOJ1212——L语言

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

  7. bzoj1212 L语言

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

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

    标题效果:给定词的列表,并m串 每个字符串q个最长前缀,这个前缀可满足拆分成一些字符串 这些字符串中存在的词汇太 再也不怕错误的数据范围--有一个很明显Trie树能解决的问题竟然被我写的AC自己主动机 ...

  9. [HNOI2004][bzoj1212] L语言 [Trie+dp]

    题面 传送门 思路 无后效性 显然,不管某个前缀的理解方式是怎么样的,如果它能被理解,那么前面的决策对于后面的决策而言都是等价的 因此这题可以DP DP方程 令$dp[i]$表示前缀i是否能被理解 那 ...

  10. AC自动机算法 && 例题

    参考链接: https://blog.csdn.net/bestsort/article/details/82947639#commentBox https://blog.csdn.net/niush ...

随机推荐

  1. php语言基础(一)

    一.php标记风格 1.1xml风格(常用) <?php echo "xml风格": ?> 1.2脚本风格 <script language="php& ...

  2. typedef void(*Fun)(void);

    typedef void(*Fun)(void); 函数类似于数组,函数名就是它的首地址: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  3. Linux下jdk环境配置

    1.下载jdk http://www.oracle.com/technetwork/java/javase/downloads/index.html 我选择64位的版本 jdk-8u121-linux ...

  4. linear-grident的属性和使用

    css3新增Gradient属性,用来增加渐变的效果,渐变分为线性渐变 linear-grident 和 径向渐变 radial-grident,这篇文章主要介绍线性渐变linear-grident ...

  5. 针对Eclipse的maven Missing artifact com.microsoft.sqlserver:slqjdbc4:jar:4.0

    maven 中添加sqlserver 出错,报错内容 maven Missing artifact com.microsoft.sqlserver 解决方法这里先下载好jar包 ,然后maven命令执 ...

  6. Zabbix 3.0 监控Web

    zabbix 界面配置 触发器添加

  7. win7连接共享打印机

    1. 保证目标电脑启用共享.打印机驱动安装正常 2. 目标电脑进入"设备和打印机" 3. 右键要共享的打印机 - 打印机属性 -共享此打印机 4. 其他电脑打印时,选择其他打印机, ...

  8. 说说VNode节点(Vue.js实现)

    写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/an ...

  9. jQuery(function(){...})与(function($){...})(jQuery)的“兄弟”情结

    记得那时在学习写基于jQuery的插件时,了解到(function($){...})(jQuery)的代码结构,一开始还没发觉,后来百度了解它的语意时,从搜索结果中发现了jQuery(function ...

  10. Ubuntu14.04上安装Composer

    1,查看机子上有没有安装php 2,下载Composer的安装包 3,安装Composer 4,设置Composer全局可访问