bzoj 1212: [HNOI2004]L语言 AC自动机+状压
为什么这道题网上所有题解写的都是N*Len的trie树的暴力啊,4E的复杂度。。。
为什么暴力还跑这么快啊TAT。。
有一个O(Len)的做法就是先把AC自动机建出来,因为每个字典串的长度很小,所以我们可以用fail树状压一发,每个节点记录一个值ss,表示这个点向前(1~10)的长度的串是不是一个字典串,这个东西延fail树递推就行了。
然后每次把每个串放AC自动机上走,同时记录一个值T表示(s(1,i-11)~s(1-(i-1)))这些串能否成为答案,如果如果T&ss!=0那么i这个点就可以成为答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int n,m;
char s[];
int ch[][];int cnt;int v[];
int fail[];int len[];
void insert()
{
int ln=strlen(s);int now=;
for(int i=;i<ln;i++)
{
int c=s[i]-'a';
if(ch[now][c])
{
now=ch[now][c];
}
else
{
ch[now][c]=++cnt;
len[cnt]=len[now]+;
now=ch[now][c];
}
}
v[now]=;
}
queue<int>q;
unsigned int ss[];
void build()
{
for(int i=;i<;i++)if(ch[][i])q.push(ch[][i]);
while(!q.empty())
{
int tmp=q.front();q.pop();
for(int i=;i<;i++)
{
if(ch[tmp][i])
{
q.push(ch[tmp][i]);
fail[ch[tmp][i]]=ch[fail[tmp]][i];
}
else
{
ch[tmp][i]=ch[fail[tmp]][i];
}
}
if(v[tmp])ss[tmp]=(ss[fail[tmp]]^(<<(len[tmp]-)));
else ss[tmp]=ss[fail[tmp]];
}
return ;
}
unsigned int tmp;
void solve()
{
int ans=;
unsigned int ssr=;
int ln=strlen(s+);
int now=;
for(int i=;i<=ln;i++)
{
int c=s[i]-'a';
now=ch[now][c];
tmp=ssr;
ssr<<=;
if(tmp&ss[now])ans=max(ans,i),ssr^=;
}
printf("%d\n",ans);
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",s);
insert();
}
build();
for(int i=;i<=m;i++)
{
scanf("%s",s+);
solve();
}
return ;
}
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自己主动机(Trie树)+动态规划
标题效果:给定词的列表,并m串 每个字符串q个最长前缀,这个前缀可满足拆分成一些字符串 这些字符串中存在的词汇太 再也不怕错误的数据范围--有一个很明显Trie树能解决的问题竟然被我写的AC自己主动机 ...
- BZOJ 1212: [HNOI2004]L语言( dp + trie )
因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...
- BZOJ 1212 [HNOI2004]L语言 【AC自动机 + 背包】
题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1212] 题意:给你一些单词,然后给出一个没有标点的文本串S,都是小写字符.现在让你求用给出 ...
- [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] ...
随机推荐
- k8s环境搭建--基于minik8s方法
minik8s 安装 关闭selinux.开启ipv6 sudo bash selinux_ipv6.sh 下载kubectl和minikube 下载minikube,因为国外的源被墙了,所以只能用阿 ...
- Protocol buffer的使用案例
Protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.google 提供了多种语言的实现:java.c#.c++.go 和 python,每一种实 ...
- Python从菜鸟到高手:格式化字符串
1. 字符串格式化基础 字符串格式化相当于字符串模板.也就是说,如果一个字符串有一部分是固定的,而另一部分是动态变化的,那么就可以将固定的部分做成模板,然后那些动态变化的部分使用字符串格式化操作符(% ...
- Linux系统下安装jdk1.8
JDK安装分为两种方式 一种是解压tar.gz配置安装, 一种是rpm安装,我这里是tar.gz安装方式 一.首先在oracle官方网下载jdk,网址如下:http://www.oracle.com ...
- a标签的href为空的问题
在表格里写一个a标签链接刷新表格的时候,没注意,把a标签的href设置为""空字符串,导致每次刷新表格之后会再刷新一次整体页面,找了很久都没发现问题出在哪里,最后无意之间,鼠标在一 ...
- TeamWork#3,Week5,Scrum Meeting 11.4
今天我们进行了第一次Scrum Meeting,总结了最近一段时间的工作成果和经验教训,并分配了每个成员下一步的工作.网络爬虫对我们来说是一个难点,因为之前接触比较少,所以需要从头学起.我们参考了大量 ...
- JAVA第二次试验
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1352 姓名:潘俊洋 学号:20135230 成绩: 指导教师:娄嘉鹏 ...
- 《Spring2之站立会议2》
<Spring2之站立会议2> 昨天,模仿着资料把客户端和服务器端的代码写了一下: 今天,继续找本机的端口号和逐步深入理解代码含义: 遇到的问题,在理解时,对一些知识理解还是比较朦胧,一知 ...
- 防止DDoS攻击,每5分钟监控本机的web服务,将目前已经建立连接的IP计算出来,且实现top5。再此基础上,将并发连接超过50的IP禁止访问web服务
netstat -lntupa | grep ":80" | grep ESTABLISHED | awk '{print $5}' | awk -F: '{print $1}' ...
- @Dataprovider 和 @Factory 的使用
总结: 0.@Dataprovider 所修饰的方法必须 return Object[][] ; @Facotry 所修饰的方法必须return Object[] ; 1.在测试场景中经常会遇到一个 ...