描述

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

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

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

现在,考古工作者遇到了一个难题。对于每一段文字,其前缀在母串上的最大匹配长度是多少呢?

输入

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

第二行是一个长度为N的字符串,所有字符都满足是E,S,W和N中的一个。

之后M行,每行有一个字符串,描述了一段带有玄武密码的文字。依然满足,所有字符都满足是E,S,W和N中的一个。

对于100%的数据,N<=10^7,M<=10^5,每一段文字的长度<=100。

输出

输出有M行,对应M段文字。

每一行输出一个数,表示这一段文字的前缀与母串的最大匹配串长度。

样例输入

7 3
SNNSSNS
NNSS
NNN
WSEE

样例输出

4
2
0

题意

如上。

题解

M个串建AC自动机,由于只有ESWN四个字符,所以只用开4,记录串i在AC自动机最后的位置id,并且记录父节点father和深度d。

查询S所能到达的所有节点,标记vis。

最后串i最后的位置id往上跑,如果已经被标记输出dis。

时间复杂度O(N+100*M)。

代码

 #include<bits/stdc++.h>
using namespace std; const int N=1e7+,M=1e5+;
int tot,son[N][],father[N],fail[N],q[N],d[N],id[M];
int n,m;char s[N],s1[N];
bool vis[N];
inline int get(char ch){
if(ch=='E')return ;
else if(ch=='S')return ;
else if(ch=='W')return ;
else return ;
}
void insert(int p){
for(int l=strlen(s),x=,i=,w;i<l;i++){
if(!son[x][w=get(s[i])])son[x][w]=++tot;
father[son[x][w]]=x;d[son[x][w]]=d[x]+;x=son[x][w];
if(i==l-)id[p]=x;
}
}
void make(){
int h=,t=,i,j,x;fail[]=-;
for(i=;i<;i++)if(son[][i])q[++t]=son[][i];
while(h<=t)for(x=q[h++],i=;i<;i++)
if(son[x][i])fail[son[x][i]]=son[fail[x]][i],q[++t]=son[x][i];
else son[x][i]=son[fail[x]][i];
}
void find(){
for(int l=n,x=,i=,j;i<l;i++){
x=son[x][get(s1[i])];
for(j=x;j;j=fail[j])vis[j]=;
}
}
int dfs(int u){
for(int i=u;i>;i=father[i])
if(d[i]&&vis[i])return d[i];
return ;
}
int main()
{
scanf("%d%d%s",&n,&m,s1);
for(int i=;i<=m;i++)scanf("%s",s),insert(i);
make();
find();
for(int i=;i<=m;i++)printf("%d\n",dfs(id[i]));
return ;
}

最新文章

  1. 关于nginx.pid丢失的解决办法
  2. iOS后台定位时授权提示一闪而过的解决办法
  3. Mysql中mysqldump命令使用详解
  4. Web API 基于ASP.NET Identity的Basic Authentication
  5. 华东交通大学2016年ACM“双基”程序设计竞赛 1010
  6. RHEL 6.4中解决xx用户不在sudoers列表,此事将被报告的问题
  7. HDU4513吉哥系列故事――完美队形II(manacher算法)
  8. 分布式文件系统FastDFS设计原理
  9. MD5和Base64介绍与应用
  10. ServletConfig和ServletContext
  11. luci编译错误
  12. 懒人小技巧, Toad 常用偷懒方法
  13. linux 学习笔记 mysql安装总结
  14. 创建Car类,包含name,price属性,构造器等方法,创建测试类,在main方法中创建Set接口的实现类,添加5个以上的Car对象,遍历集合元素,验证重复元素是否过滤了; 如果没有过滤,实现过滤功能;把每个小车的price降10000元,再遍历,查看price是否已改变
  15. ubuntu下签名命令
  16. JavaScript操作和使用Cookie
  17. 浅谈js之闭包
  18. 前端 HTML form表单标签 input标签 type属性 重置按钮 reset
  19. JSON数据的处理中的特殊字符
  20. iOS - UITextView放在自定义cell里面-自适应高度

热门文章

  1. VM 虚拟机使用桥接模式却连不上网的解决办法(转载)
  2. &lt;linux常用命令&gt;初级版
  3. asp.net Core 获取应用程序所在目录的2种方式
  4. vue+layui制作列表页
  5. Python全栈开发:web框架
  6. sectionStorage与localStorage更新缓存,以及更新layui的数据缓存
  7. vue element传的值报_self.$scopedSlots.default is not a function
  8. Miler-Rabbin素数判定
  9. 洛谷P2526 【SHOI2001】小狗散步
  10. Android之GridLayout网格布局