P5231 [JSOI2012]玄武密码

链接

分析:

  首先对所有询问串建立AC自动机,然后扫描一遍母串,在AC自动机上走,没走到一个点,标记这个点走过了,并且它的fail树上的祖先节点也可以访问到(即可以匹配到主串),于是沿着fail树打标记,当到一个已经打过标记的点的时候,退出。这样保证每个点只会被打标机一次。询问时,在AC自动机上倒着往前走,走到第一个打过标记的点的时候,从AC自动机的根节点到这个点的距离就是答案。复杂度$O(N+100M)$。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int SZ = , N = ;
int id[], len[N], pos[N], ch[SZ][], fa[SZ], q[SZ], fail[SZ], Index;
bool vis[SZ];
char s[SZ], t[]; void Insert(char *s,int k) {
int u = ;
for (int i = ; i <= len[k]; ++i) {
int c = id[(int)s[i]];
if (!ch[u][c]) ch[u][c] = ++Index, fa[Index] = u;
u = ch[u][c];
}
pos[k] = u;
}
void bfs() {
int L = , R = ;
for (int i = ; i <= ; ++i) if (ch[][i]) q[++R] = ch[][i];
while (L <= R) {
int u = q[L ++];
for (int c = ; c <= ; ++c) {
int v = ch[u][c];
if (!v) ch[u][c] = ch[fail[u]][c];
else fail[v] = ch[fail[u]][c], q[++R] = v;
}
}
}
int Calc(int x) {
int ans = len[x];
for (int i = pos[x]; i; i = fa[i], ans --)
if (vis[i]) return ans;
}
int main() {
int n = read(), m = read();
id['E'] = , id['S'] = , id['W'] = , id['N'] = ;
scanf("%s", s + );
for (int i = ; i <= m; ++i) {
scanf("%s", t + );
len[i] = strlen(t + );
Insert(t, i);
}
bfs();
int u = , v;
for (int i = ; i <= n; ++i) {
int c = id[(int)s[i]];
u = ch[u][c];
v = u;
while (v && !vis[v]) vis[v] = , v = fail[v];
}
for (int i = ; i <= m; ++i)
printf("%d\n", Calc(i));
return ;
}

最新文章

  1. javascript设计模式之观察者模式
  2. Java 利用HttpURLConnection发送http请求
  3. java中的URLConnection
  4. QT实现贪吃蛇
  5. js深拷贝和浅拷贝
  6. SQL将用户表中已存在的数据所有姓名(汉字)转换为拼音首字母
  7. Android播播放完SD卡指定文件夹音乐之后,自动播放下一首
  8. Adobe Dreamweaver CS6 序列号 注册码(转自91zcm)
  9. HTML5移动开发中的input输入框类型
  10. twisted学习之reactor
  11. 基于Node.js的微信JS-SDK后端接口实现
  12. LeetCode 437. Path Sum III (路径之和之三)
  13. java爬虫--jsoup简单的表单抓取案例
  14. JAVA IO分析一:File类、字节流、字符流、字节字符转换流
  15. win10安装Ubuntu14.04双系统
  16. 从1....n中随机输出m个不重复的数
  17. VS 2013+ ArcGIS 10.3 AddIn 断点不断异常解决
  18. HBuilder只提示html 不提示js
  19. js java 给定一个目标值,在一棵树中找是否有两个节点的值之和等于目标值
  20. 【转载】app测试的过程和重点关注内容

热门文章

  1. 写markdown用于Github上readme.md文件
  2. POST请求上传多张图片并携带参数
  3. 用UIControl封装Button
  4. apache的AllowOverride以及Options使用详解
  5. Promise &amp; Deferred objects in JavaScript Pt.1: Theory and Semantics.
  6. Objective-C 与命名空间
  7. SVN提交的动作解释
  8. Vue2.5开发去哪儿网App 从零基础入门到实战项目
  9. 使用Message
  10. Week5:Neural Network BackPropagation疑难点记录