BZOJ4327 [JSOI2012] 玄武密码 [AC自动机]
玄武密码
Description
Input
Output
Sample Input
SNNSSNS
NNSS
NNN
WSEE
Sample Output
2
0
HINT
对于100%的数据,N<=10^7,M<=10^5,每一段文字的长度<=100。
分析:
AC自动机的好题。
建Trie树的时候记录一下每个节点的父节点和每一段模式串的终点,然后建立$fail$指针再跑一边文本串,再经过了的节点打上标记,然后对每一个模式串询问,从终点一直往根节点跳,只要遇到打上标记的点就直接返回答案(也就是该模式串总长减去遍历经过的节点数)。
Code:
//It is made by HolseLee on 13rd Aug 2018
//BZOJ4327
#include<bits/stdc++.h>
using namespace std; const int N=1e7+;
const int M=;
const int maxn=5e5+;
int n,m,tot,fail[maxn],fa[maxn],point[maxn],lo[maxn/];
char s[N],a[M];
struct Node{
int nxt[];bool vis;
}t[maxn];
queue<int>team; struct Trie{ int get(char ch)
{
if(ch=='E')return ;
if(ch=='S')return ;
if(ch=='W')return ;
if(ch=='N')return ;
} void ins(char *ch,int x)
{
int root=,k,len=strlen(ch);
for(int i=;i<len;++i){
k=get(ch[i]);
if(!t[root].nxt[k])
t[root].nxt[k]=++tot,
fa[t[root].nxt[k]]=root;
root=t[root].nxt[k];
}
point[x]=root;
} void getfail()
{
int root=;
for(int i=;i<;++i){
if(t[root].nxt[i])
fail[t[root].nxt[i]]=,
team.push(t[root].nxt[i]);
}
while(!team.empty()){
root=team.front();team.pop();
for(int i=;i<;++i)
if(t[root].nxt[i]){
fail[t[root].nxt[i]]=t[fail[root]].nxt[i];
team.push(t[root].nxt[i]);
}
else t[root].nxt[i]=t[fail[root]].nxt[i];
}
} void pre()
{
for(int i=;i<=tot;++i)t[i].vis=false;
int root=,id;
for(int i=;i<n;++i){
id=get(s[i]);
root=t[root].nxt[id];
for(int j=root;j;j=fail[j])
if(t[j].vis)break;
else t[j].vis=;
}
} int quary(int x)
{
int ret=lo[x];
for(int i=point[x];i;i=fa[i]){
if(t[i].vis)return ret;
ret--;
}
return ;
}
}T; int main()
{
scanf("%d%d%s",&n,&m,s);
for(int i=;i<=m;++i){
scanf("%s",a);
lo[i]=strlen(a);
T.ins(a,i);
}
T.getfail();T.pre();
for(int i=;i<=m;++i)
printf("%d\n",T.quary(i));
return ;
}
BZOJ4327 [JSOI2012] 玄武密码 [AC自动机]的更多相关文章
- 【BZOJ4327】JSOI2012 玄武密码 AC自动机
[BZOJ4327]JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香 ...
- BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4327 题解: 做法挺显然,建出AC自动机之后在上面跑,标记所有走过的点,然后再进行递推 ...
- BZOJ4327 JSOI2012玄武密码(AC自动机)
当然可以在SA上二分答案,但看起来会被卡log.考虑对模板串建出AC自动机,用母串在上面跑,标记上所有能到达的点.注意到达某个点时需要标记所有其通过fail指针可以走到的点,如果遇到一个标记过的点就可 ...
- 【AC自动机】bzoj4327: JSOI2012 玄武密码
题目思路没话讲:主要是做题时候的细节和经验 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中 ...
- Vijos P1951 玄武密码 (AC自动机)
描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...
- TZOJ 5986 玄武密码(AC自动机)
描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...
- BZOJ 4327: JSOI2012 玄武密码 后缀自动机
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- BZOJ4327 : JSOI2012 玄武密码
对所有询问串建立AC自动机. 然后将母串在AC自动机上跑,每走到一个点x,从x点出发沿着fail指针能到的所有前缀都是匹配成功的,暴力向上走,碰到走过的就break,这样每个点最多只会被标记一次. 时 ...
- BZOJ4327:[JSOI2012]玄武密码(SAM)
Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. ...
随机推荐
- 修改Tomcat端口
1.自己的tomcat修改端口号,在tomcat解压缩目录中conf目录下又一个server.xml,将HTTP协议的端口修改为自己想要的即可 <Connector port="808 ...
- OpenCV---图像梯度
图像梯度 推文:[OpenCV入门教程之十二]OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑 图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个 ...
- nginx目录路径重定向[转]
如果希望域名后边跟随的路径指向本地磁盘的其他目录,而不是默认的web目录时,需要设置nginx目录访问重定向. 应用场景:dashidan.com/image自动跳转到dashidan.com/fol ...
- JAVA多线程提高六:java5线程并发库的应用_线程池
前面我们对并发有了一定的认识,并且知道如何创建线程,创建线程主要依靠的是Thread 的类来完成的,那么有什么缺陷呢?如何解决? 一.对比new Threadnew Thread的弊端 a. 每次ne ...
- 重构改善既有代码设计--重构手法15:Remove Middle Man (移除中间人)
某个类做了过多的简单委托动作.让客户直接调用受托类. 动机:在Hide Delegate (隐藏委托关系)的“动机”中,谈到了“封装委托对象”的好处.但是这层封装也是要付出代价的,它的代价是:每当客户 ...
- 《JavaScript 实战》:JavaScript 实现图片切割效果
很久之前就在一个网站的截取相片的功能中看到这个效果,也叫图片裁剪.图片剪切(设置一下也可以做出放大镜等类似的效果).当时觉得很神奇,碍于水平有限,没做出来.前些日子突然想做一个透镜效果,就突然想到了这 ...
- 在Windows下安装MongoDB
概述 读者可以通过本文来学习在Windows操作系统上安装MongoDB. 从2.2版本开始,Mongo DB不在支持Windows XP.请使用最近的windows来安装最近发布的MongoDB.本 ...
- pycharm设置字体大小
pycharm 是很好的一个IDE,在windows下,和macOS下,都能很好的运行.唯一缺点是启动慢. 默认字体太小,在mac下,需要瞪大24K氪金狗眼才能看清. 为了保护好眼睛,我们需要把字体调 ...
- ASLR
@author:dlive ASLR address space layout randomization 微软从windows vista/windows server 2008(kernel ve ...
- [004] last_k_node
[Description] find the k-th node from the last node of single linked list. e.g. Linked-list: 1-2-3-4 ...