原题传送门

我们先对所有询问串建立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 玄武密码的更多相关文章

  1. BZOJ 4327: JSOI2012 玄武密码 后缀自动机

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...

  2. BZOJ 4327 JSOI2012 玄武密码(后缀自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4327 [题目大意] 求每个子串在母串中的最长匹配 [题解] 对母串建立后缀自动机,用每 ...

  3. BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4327 题解: 做法挺显然,建出AC自动机之后在上面跑,标记所有走过的点,然后再进行递推 ...

  4. bzoj 4327: JSOI2012 玄武密码

    听说这题不公开.. 那就不贴题意了 一眼看上去还以为是exkmp的裸题.. 看了数据范围,呵呵.. 多串匹配嘛.. 就用AC自动机咯,而且每个点最多也就只有$4$个孩子 用原串在AC自动机上走,碰到的 ...

  5. 4327: JSOI2012 玄武密码

    4327: JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老 ...

  6. 4327: JSOI2012 玄武密码[SAM]

    4327: JSOI2012 玄武密码 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 112[Submit][Status] ...

  7. 【BZOJ4327】JSOI2012 玄武密码 AC自动机

    [BZOJ4327]JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香 ...

  8. P5231 [JSOI2012]玄武密码

    P5231 [JSOI2012]玄武密码 链接 分析: 首先对所有询问串建立AC自动机,然后扫描一遍母串,在AC自动机上走,没走到一个点,标记这个点走过了,并且它的fail树上的祖先节点也可以访问到( ...

  9. 2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机)

    2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机) https://www.luogu.com.cn/problem/P5231 题意: 给出字符串S和若干T,求S与每个T的 ...

随机推荐

  1. 分享一个.NET(C#)按指定字母个数截断英文字符串的方法–提供枚举选项,可保留完整单词

    分享一个.NET(C#)按字母个数截断英文字符串的方法,该方法提供枚举选项.枚举选项包括:可保留完整单词,允许最后一个单词超过最大长度限制,字符串最后跟省略号以及不采取任何操作等,具体示例实现代码如下 ...

  2. 编译用到boost相关的东西,问题的解决;以及和googletest库

    编译https://github.com/RAttab/reflect, 发现需要gcc4.7以上的版本才行.于是编译安装最新的gcc-6.2.0, 过程算顺利. http://www.linuxfr ...

  3. 学习erlang书籍 - 转

    Here are a few resources:Programming Erlang, by Joe Armstrong. A good book, really teaching you more ...

  4. ASP.Net Core 2.2 MVC入门到基本使用系列 (三)(转)

    本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...

  5. MACD各分时背离所对应的时间

    MACD各分时背离所对应的时间 5分钟背离结构——2小时.           15分钟背离结构——一天半(6小时).           30分钟背离结构——3天(12小时).            ...

  6. 2017高教杯数学建模B 题分析

    B题原文 "拍照赚钱"是移动互联网下的一种自助式服务模式.用户下载APP,注册成为APP的会员,然后从APP上领取需要拍照的任务(比如上超市去检查某种商品的上架情况),赚取APP对 ...

  7. Codeforces Round #322 (Div. 2) E F

    E. Kojiro and Furrari 题意说的是 在一条直线上 有n个加油站, 每加一单位体积的汽油 可以走1km 然后每个加油站只有一种类型的汽油,汽油的种类有3种 求从起点出发到达终点要求使 ...

  8. 准备dbcp2-2.1.1和pool2-2.4.2 、commons-dbcp-1.4jar包

    下载地址:https://pan.baidu.com/s/1gtcW36Lz6Yt-j9WlTu31Pw

  9. Life Winner Bo (博弈论)

    kind:维持让对手处于(奇数,奇数)的状态,就能赢. rook:维持让对手处于(A,A)相等的状态,就能赢. knight:画图找规律,没有到达终点的就是平局. queen:威佐夫博弈论,终点不一样 ...

  10. 韩松毕业论文笔记-第六章-EFFICIENT METHODS AND HARDWARE FOR DEEP LEARNING

    难得跟了一次热点,从看到论文到现在已经过了快三周了,又安排了其他方向,觉得再不写又像之前读过的N多篇一样被遗忘在角落,还是先写吧,虽然有些地方还没琢磨透,但是paper总是这样吧,毕竟没有亲手实现一下 ...