【BZOJ4327】JSOI2012 玄武密码

Description

在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河。相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中。老人们说,这是玄武神灵将天书藏匿在此。 
很多年后,人们终于在进香河地区发现了带有玄武密码的文字。更加神奇的是,这份带有玄武密码的文字,与玄武湖南岸台城的结构有微妙的关联。于是,漫长的破译工作开始了。 
经过分析,我们可以用东南西北四个方向来描述台城城砖的摆放,不妨用一个长度为N的序列来描述,序列中的元素分别是‘E’,‘S’,‘W’,‘N’,代表了东南西北四向,我们称之为母串。而神秘的玄武密码是由四象的图案描述而成的M段文字。这里的四象,分别是东之青龙,西之白虎,南之朱雀,北之玄武,对东南西北四向相对应。 
现在,考古工作者遇到了一个难题。对于每一段文字,其前缀在母串上的最大匹配长度是多少呢? 

Input

第一行有两个整数,N和M,分别表示母串的长度和文字段的个数。 
第二行是一个长度为N的字符串,所有字符都满足是E,S,W和N中的一个。 
之后M行,每行有一个字符串,描述了一段带有玄武密码的文字。依然满足,所有字符都满足是E,S,W和N中的一个。 

Output

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

Sample Input

7 3
SNNSSNS
NNSS
NNN
WSEE

Sample Output

4
2
0

HINT

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

题解:沿着AC自动机搜几遍即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn=10000010;
struct node
{int ch[4],fail,cnt,vis,ans,dep;
}p[maxn];
int dic(char le)
{switch(le){case 'E':return 0;case 'S':return 1;case 'W':return 2;case 'N':return 3;}
}
int n,m,tot;
int Q[maxn],pos[100010];
char w[110],str[maxn];
queue<int> q;
void build()
{int i,u,t;q.push(1);while(!q.empty()){u=q.front(),q.pop();Q[++Q[0]]=u;for(i=0;i<4;i++){if(p[u].ch[i]){q.push(p[u].ch[i]);t=p[u].fail;while(!p[t].ch[i]&&t)    t=p[t].fail;if(t)    p[p[u].ch[i]].fail=p[t].ch[i];else    p[p[u].ch[i]].fail=1;}}}
}
void search()
{int i,j,u=1,t;p[u].vis=0;for(i=0;i<n;i++){while(!p[u].ch[dic(str[i])]&&u)    u=p[u].fail;u=p[u].ch[dic(str[i])];u=u>0?u:1;p[u].vis=1;}for(i=tot;i>=2;i--)    p[p[Q[i]].fail].vis|=p[Q[i]].vis;for(i=1;i<=tot;i++){if(p[Q[i]].vis)    p[Q[i]].ans=p[Q[i]].dep;for(j=0;j<4;j++)if(p[Q[i]].ch[j])p[p[Q[i]].ch[j]].ans=p[Q[i]].ans;}for(i=1;i<=m;i++)    printf("%d\n",p[pos[i]].ans);
}
int main()
{scanf("%d%d%s",&n,&m,str);int i,j,k,u,t;tot=1;for(i=1;i<=m;i++){scanf("%s",w);k=strlen(w);u=1;for(j=0;j<k;j++){if(!p[u].ch[dic(w[j])])    p[u].ch[dic(w[j])]=++tot;u=p[u].ch[dic(w[j])];p[u].dep=j+1;}p[u].cnt++;pos[i]=u;}build();search();return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/6265079.html

【BZOJ4327】JSOI2012 玄武密码 AC自动机相关推荐

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

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

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

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

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

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

  4. BZOJ 4327 【JSOI 2012】 玄武密码 AC自动机+dfs

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

  5. BZOJ4327 : JSOI2012 玄武密码

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

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

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

  7. [BZOJ4327] JSOI2012玄武密码

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

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

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

  9. P5231 [JSOI2012]玄武密码(SAM 经典运用)

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

最新文章

  1. PostgreSQL 电商业务(任意维度商品圈选应用) - json包range数组的命中优化 - 展开+索引优化...
  2. [推荐] 创业者要留意优先清算权
  3. http https http2.0
  4. y电容如何选型_开关电源中电容如何快速选型
  5. [Data Pump]expdp导出笔记
  6. 【操作系统】Unix文件类型有哪些
  7. matlab进化树的下载,mega7.0进化树软件下载-mega 7.0 win 64位下载【附详细使用教程】 - 百当下载站...
  8. 如何在自带.net4.8的Windows 10系统上装其他版本的.net
  9. windows之IP地址(一)
  10. 海洋cms常见问题有哪些?
  11. 小语种语音情感语料库的建立——论文阅读1
  12. 五层协议之数据链路层
  13. 课程笔记《碳中和产业报告》
  14. PHP等比缩放并补白
  15. 通过抓包判断是否支持 802.11k and 11r
  16. 裸辞4个月,面试了30家公司,终于找到了理想的工作
  17. APP超级签名分发系统 企业签名免签封装微信多开自助分发多合一系统
  18. pgsql——查询常用
  19. 关于机器人操作系统(ROS)学习前须知二三
  20. win10 安装cp2102驱动和查看端口号

热门文章

  1. 极客日报第 53 期:抖音将代替拼多多成为春晚独家红包合作伙伴;高通正研发 8cx 升级版处理器,对标苹果 M1;DuckDuckGo 日查询量首次突破 1 亿
  2. 注册hotmail.co .jp后缀的hotmail邮箱
  3. “大姨吗”创始人柴可:“慢就是快”
  4. ipad4、ipad3与微信等版本过高的软件不兼容解决办法
  5. C语言的部分杂碎知识
  6. windows7 安装哪个版本的vs_门套安装45度拼接VS直角拼接,哪个更好?
  7. 解决VS2010使用mscomm控件无法接收数据的问题
  8. 陇原战“疫“2021 复现Re
  9. 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决
  10. offer--刷题之路(持续更新)