【题解】bzoj 4327 JSOI2012 玄武密码
原题传送门
我们先对所有询问串建立AC自动机(今天洛咕上有人分不清AC自动机和自动AC机)
然后将母串在AC自动机上跑,每走到一个点x,从x点出发沿着fail指针所能到的所有前缀都是匹配成功的,暴力向上走,碰到走过的就break(剩下的肯定都走过),这样每个点最多被标记1次
最后再把每个询问串走一遍统计答案
时间复杂度为\(O(N+100M)\)
#include <bits/stdc++.h>
#define N 10000005
#define M 105
#define K 100005
using namespace std;
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
int tx[50],n,m;
struct Aho_corasick_Automaton{
int c[N][5],end[K],fail[N],cnt,l[K],pre[N],flag[N];
queue<int> q;
inline void ins(register char *s,register int t)
{
int len=strlen(s),now=0;
l[t]=len;
for(register int i=0;i<len;++i)
{
int v=tx[s[i]-'A'];
if(!c[now][v])
c[now][v]=++cnt,pre[cnt]=now;
now=c[now][v];
}
end[t]=now;
}
inline void build()
{
for(register int i=0;i<4;++i)
if(c[0][i])
fail[c[0][i]]=0,q.push(c[0][i]);
while(!q.empty())
{
int u=q.front();
q.pop();
for(register int i=0;i<4;++i)
if(c[u][i])
fail[c[u][i]]=c[fail[u]][i],q.push(c[u][i]);
else
c[u][i]=c[fail[u]][i];
}
}
inline void find(register char *s)
{
int len=strlen(s),now=0;
for(register int i=0;i<len;++i)
{
int v=tx[s[i]-'A'];
now=c[now][v];
int k=now;
while(k>1)
{
if(flag[k])
break;
flag[k]=1;
k=fail[k];
}
}
}
inline int solve(register int t)
{
int now=end[t];
for(register int i=l[t];i;--i)
{
if(flag[now])
return i;
now=pre[now];
}
return 0;
}
}ac;
char s[N],st[M];
int main()
{
tx['E'-'A']=0,tx['S'-'A']=1,tx['W'-'A']=2,tx['N'-'A']=3;
scanf("%d%d",&n,&m);
scanf("%s",s);
for(register int i=1;i<=m;++i)
{
scanf("%s",st);
ac.ins(st,i);
}
ac.build();
ac.find(s);
for(register int i=1;i<=m;++i)
write(ac.solve(i)),puts("");
return 0;
}
【题解】bzoj 4327 JSOI2012 玄武密码的更多相关文章
- BZOJ 4327: JSOI2012 玄武密码 后缀自动机
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- BZOJ 4327 JSOI2012 玄武密码(后缀自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4327 [题目大意] 求每个子串在母串中的最长匹配 [题解] 对母串建立后缀自动机,用每 ...
- BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4327 题解: 做法挺显然,建出AC自动机之后在上面跑,标记所有走过的点,然后再进行递推 ...
- bzoj 4327: JSOI2012 玄武密码
听说这题不公开.. 那就不贴题意了 一眼看上去还以为是exkmp的裸题.. 看了数据范围,呵呵.. 多串匹配嘛.. 就用AC自动机咯,而且每个点最多也就只有$4$个孩子 用原串在AC自动机上走,碰到的 ...
- 4327: JSOI2012 玄武密码
4327: JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老 ...
- 4327: JSOI2012 玄武密码[SAM]
4327: JSOI2012 玄武密码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 263 Solved: 112[Submit][Status] ...
- 【BZOJ4327】JSOI2012 玄武密码 AC自动机
[BZOJ4327]JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香 ...
- P5231 [JSOI2012]玄武密码
P5231 [JSOI2012]玄武密码 链接 分析: 首先对所有询问串建立AC自动机,然后扫描一遍母串,在AC自动机上走,没走到一个点,标记这个点走过了,并且它的fail树上的祖先节点也可以访问到( ...
- 2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机)
2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机) https://www.luogu.com.cn/problem/P5231 题意: 给出字符串S和若干T,求S与每个T的 ...
随机推荐
- Go win32
先说的让人兴奋的吧,“GO的库开发在windwos上尽然是一摸一样的啊” C:\go-pro\go-self-package>go build gin-main.go 2017/09/20 14 ...
- GoWeb-Gin 文件上载
前些日子,我们Node.JS了一把. 如今,我们还是回到我们伟大的GO来吧 今天,带领大家继续Golang的啦,而且是个上传文件的例子 先给大家看结果 1. 如果是windows端,你需要安装post ...
- 关于如何利用计算属性进行button的控制
element分页没用它的 (这个只要上一页下一页),比如共2页的时候,你在第一页,你肯定可以点击下一页,当你进入到第二页的时候这个button肯定就不能点击了啊,它的属性diaabled=true让 ...
- cocos2d-x JS 开启远程代码调试
为了方便服务端与测试部门的工作需要,把客户端的写的程序可以在其他电脑上运行,方便他人工作与测试. 下面是cocos2d-x JS WebStorm 的设置方法.
- LeetCode121.买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...
- windows Server2012 IIS8.0配置安装完整教程
IIS8.0是windows Server2012自带的服务器管理系统,和以往不同,IIS8.0安装和操作都比较简单,界面很简洁,安装也很迅速.今天我们重点完整的演示下Internet Informa ...
- db2字符串相关函数的使用
db2字符串相关函数的使用 from :internet 一.字符转换函数 1.ASCII() 返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘’括起来 ...
- 编写python的程序
执行python程序有两种方式: 1.交互式环境:输入代码立即执行 优点:调试程序方便 缺点:无法永久保存程序 2.代码写入文件 ...
- 使用JFileChooser实现在指定文件夹下批量添加根据“数字型样式”或“非数字型样式”命令的文件夹
2018-11-05 20:57:00开始写 Folder.java类 import javax.swing.JFrame; import javax.swing.JPanel; import jav ...
- Spark学习之路 (十)SparkCore的调优之Shuffle调优
摘抄自https://tech.meituan.com/spark-tuning-pro.html 一.概述 大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘I ...