[JSOI2012]玄武密码

题目背景

在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河。相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中。老人们说,这是玄武神灵将天书藏匿在此。

很多年后,人们终于在进香河地区发现了带有玄武密码的文字。更加神奇的是,这份带有玄武密码的文字,与玄武湖南岸台城的结构有微妙的关联。于是,漫长的破译工作开始了。

题目描述

经过分析,我们可以用东南西北四个方向来描述台城城砖的摆放,不妨用一个长度为 nnn 的序列 sss 来描述,序列中的元素分别是 ESWN,代表了东南西北四向,我们称之为母串。而神秘的玄武密码是由四象的图案描述而成的 mmm 段文字。这里的四象,分别是东之青龙,西之白虎,南之朱雀,北之玄武,对东南西北四向相对应。

现在,考古工作者遇到了一个难题。对于每一段文字 ttt,求出其最长的前缀 ppp,满足 ppp 是 sss 的子串。

输入格式

第一行有两个整数,分别表示母串的长度 nnn 和文字段的个数 mmm。

第二行有一个长度为 nnn 的字符串,表示母串 sss。

接下来 mmm 行,每行一个字符串,表示一段带有玄武密码的文字 ttt。

输出格式

对于每段文字,输出一行一个整数,表示最长的 ppp 的长度。

样例 #1

样例输入 #1

7 3
SNNSSNS
NNSS
NNN
WSEE

样例输出 #1

4
2
0

提示

数据规模与约定

  • 对于 20%20\%20% 的数据,保证 n≤100n \leq 100n≤100,m≤50m \leq 50m≤50。
  • 对于 40%40\%40% 的数据,保证 n≤2×104n \leq 2 \times 10^4n≤2×104,m≤2×103m \leq 2 \times 10^3m≤2×103。
  • 对于 70%70\%70% 的数据,保证 n≤106n \leq 10^6n≤106,m≤2×104m \leq 2 \times 10^4m≤2×104。
  • 对于 100%100\%100% 的数据,保证 1≤n≤1071 \leq n \leq 10^71≤n≤107,1≤m≤1051 \leq m \leq 10^51≤m≤105,1≤∣t∣≤1001 \leq |t| \leq 1001≤∣t∣≤100,s,ts, ts,t 中均只含字母 E S W N

思路:

由于后缀自动机形成的有向无环图恰好能够保存所有不同的子串,即从源点出发,沿任意一些字符能够到达的状态节点形成的子串在原字符串中都存在,故对于有每一个匹配串,都可以直接沿着后缀自动机形成的有向无环图走一遍,当无路可走或走完所有匹配串字符时即找到最长的前缀长度

代码:

#include <bits/stdc++.h>using namespace std;
//#define int long long
const int N = 1e7 + 10, M = N << 1;
int fa[M], ch[M][5], len[M];
int tot = 1, np = 1;
int n, m;
char s[N], ss[110];
int hah[26];void extend(int c) {int p = np;np = ++tot;len[np] = len[p] + 1;while (p && !ch[p][c]) {ch[p][c] = np;p = fa[p];}if (!p) {fa[np] = 1;}else {int q = ch[p][c];if (len[q] == len[p] + 1) {fa[np] = q;}else {int nq = ++tot;len[nq] = len[p] + 1;fa[nq] = fa[q], fa[q] = fa[np] = nq;while (p && ch[p][c] == q) {ch[p][c] = nq;p = fa[p];}memcpy(ch[nq], ch[q], sizeof ch[q]);}}
}signed main()
{hah['E' - 'A'] = 0, hah['S' - 'A'] = 1, hah['W' - 'A'] = 2, hah['N' - 'A'] = 3;scanf("%d%d", &n, &m);scanf("%s", s);for (int i = 0; s[i]; ++i) {extend(hah[s[i] - 'A']);}while (m--) {scanf("%s", ss);int nod = 1, cnt = 0;for (int i = 0; ss[i]; ++i) {if (!ch[nod][hah[ss[i] - 'A']]) {break;}nod = ch[nod][hah[ss[i] - 'A']];++cnt;}printf("%d\n", cnt);}return 0;
}

P5231 [JSOI2012]玄武密码(SAM 经典运用)相关推荐

  1. BZOJ4327:[JSOI2012]玄武密码(SAM)

    Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此.  ...

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

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

  3. [FROM WOJ]#3744 JSOI2012 玄武密码

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

  4. bzoj4327: JSOI2012 玄武密码 AC自动机

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

  5. [BZOJ4327] JSOI2012玄武密码

    Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很 ...

  6. 【bzoj4327】JSOI2012 玄武密码 AC自动机

    题目描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此.  很多年后,人们 ...

  7. BZOJ4327 : JSOI2012 玄武密码

    对所有询问串建立AC自动机. 然后将母串在AC自动机上跑,每走到一个点x,从x点出发沿着fail指针能到的所有前缀都是匹配成功的,暴力向上走,碰到走过的就break,这样每个点最多只会被标记一次. 时 ...

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

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

  9. 【BZOJ4327】[JSOI2012] 玄武密码(AC自动机的小应用)

    点此看题面 大致题意: 给你一个长度为lenlenlen的文本串和nnn个模式串,让你求出每一个模式串的前缀与文本串的最大匹配串长度(其中模式串和文本串都只由字符'E','S','W','N'组成). ...

最新文章

  1. 性能优化技巧 - 内存关联计算
  2. 火狐浏览器pentadatyl插件的基本设置
  3. 怎么重写MDK(KEIL)Flash烧写程序
  4. reactjs基础:jsx小练习
  5. java程序服务不能启动不了_JavaService.exe注册的windows服务无法启动问题
  6. ActiveMQ消息队列的使用
  7. 基金理财系列6 之指数基金
  8. Linux C socket 编程之UDP
  9. Vue报错Module build failed Error Node Sass version 6.0.1 is incompatible with ^4.0.0.解决方案
  10. HDU2566 统计硬币【暴力】
  11. 计算机系统论文题目,计算机系统维护毕业论文题目(572个).doc
  12. Git对G码云上项目的上传及同步
  13. 对策论基础---其他类型对策简介
  14. 入门 Android Lint
  15. 怎么部署项目解析域名_内部解析服务器部署
  16. 数字化的一切都会在安全沙箱里面
  17. IoC容器Autofac
  18. POS--权益证明机制
  19. 二 、C语言程序的基本语句和基本结构
  20. 一些常用命令和快捷键总结,详见目录

热门文章

  1. [原创]WIN8系统的远程桌面漏洞 利用QQ拼音纯净版实现提权
  2. Ubuntu内网穿透搭建网站:设置跳转本地网页服务 6/17
  3. python selenium爬取kuku漫画
  4. 程序员的十层楼,比尔盖茨仅第四层,你能到第几层?
  5. 【Linux\云服务器】CentOS 7.2 64位 可视化桌面的安装与卸载
  6. 怎么修改iis服务器的密码,服务器的iis在哪里设置密码
  7. P4:正则表达式(Regular Expression)学习笔记
  8. RTX4060参数 RTX4060功耗 RTX4060 显卡性能
  9. i春秋新春战疫公益赛复现
  10. SpringBoot多表联查