题目描述

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

输入

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

输出

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

样例输入

7 3
SNNSSNS
NNSS
NNN
WSEE

样例输出

4
2
0

题解:AC自动机的题目做多了,拿到AC的题很容易就想到了。直接建立一棵trid树,在AC自动机的匹配过程中,由于题目是求每个串能匹配的最长前缀,所以没每匹配一个点,证明其祖先节点一定被匹配了,所以给当前节点和其所有的fail节点打上标记,最后,枚举每个串的单词节点往上找,第一个找到的打了标记的节点的深度就是最长匹配前缀。
总结:再次证明多做题的好处,只要多做题并给与及时的总结,渐渐的就可以打开思维,下次拿到题就可以快速联想算法了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define N 10000000
using namespace std;
int n,st,pt,tot=0;
char str[105],ptr[N],cnt[N];
int head[500000],to[500000],last[500000],num=0;
int fail[500000],date[500000][26],deep[N],ans[N];
bool vis[500000];
int opt[500000],fa[500000];
void ins(int u,int v)
{last[++num]=head[u];head[u]=num;to[num]=v;return ;
}
queue<int> q;
void build()
{for(int i=0;i<4;i++)if(date[0][i])q.push(date[0][i]);while(!q.empty()){int re=q.front();q.pop();for(int i=0;i<4;i++){if(!date[re][i]){date[re][i]=date[fail[re]][i];continue;}q.push(date[re][i]);fail[date[re][i]]=date[fail[re]][i];}}
}
void dfs(int x)
{for(int i=head[x];i;i=last[i]){deep[to[i]]=deep[x]+1;fa[to[i]]=x;dfs(to[i]);}
}
int tra(char ch)
{return ch == 'E' ? 0 : ch == 'S' ? 1 : ch == 'W' ? 2 : 3;
}
int main()
{
//  freopen("in.in","r",stdin);
//  freopen("my.out","w",stdout);scanf("%d%d",&pt,&n);scanf("%s",ptr+1);for(int i=1;i<=n;i++){scanf("%s",str+1);st=strlen(str+1);int t=0;for(int j=1;j<=st;j++){if(!date[t][tra(str[j])]) date[t][tra(str[j])]=++tot,ins(t,tot);t=date[t][tra(str[j])];}opt[i]=t;}build();dfs(0);int j=0;vis[0]=1;for(int i=1;i<=pt;i++){int re=tra(ptr[i]);j=date[j][re];vis[j]=1;int t=fail[j];while(t && !vis[t]) vis[t]=1,t=fail[t];}for(int i=1;i<=n;i++){int t=opt[i];while(t!=0 && !vis[t]) t=fa[t]; if(t==0) ans[i]=0;else ans[i]=deep[t];printf("%d\n",ans[i]);}return 0;
}

BZOJ 4327 【JSOI 2012】 玄武密码 AC自动机+dfs相关推荐

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

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

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

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

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

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

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

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

  5. BZOJ_4327_JSOI2012 玄武密码_AC自动机

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

  6. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

  7. 洛谷 P-4045 密码(AC自动机+状态压缩+数位DP+乱搞)

    洛谷 P-4045 密码 记AC的第一道黑题! 题意:已知一段密码包含了一些字符串,然后求满足条件的密码有多少个,数量小于42时还得全部输出 思路: 一开始WA了两个点,不知道WA的什么,索性把读入的 ...

  8. [JSOI2009]密码——AC自动机+记忆化搜索(状压)

    题面 Bzoj1559 解析  要求一个能包含所有字符串的串的个数,联想到AC自动机. 每一个节点需要存一个终点信息,即以这个点为结尾的字符串编号,这个需要开一个vector来存,因为一个节点需要继承 ...

  9. BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)

    诶这题洛谷居然没有??? 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1444 题解: 我见到主要有两种做法. 一是矩阵乘法.设\(d ...

最新文章

  1. 如何保证Qt状态机的最佳性能
  2. sc修改服务器,华为sc服务器配置方法
  3. 中小企业网络结构设计1(华为版)
  4. 【Flutter】Hero 动画 ( Hero 动画使用流程 | 创建 Hero 动画核心组件 | 创建源页面 | 创建目的页面 | 页面跳转 )
  5. koa2异常处理_读 koa2 源码后的一些思考与实践
  6. 算命数据_未来的数据科学家或算命精神向导
  7. android键盘事件
  8. QComboBox列表项高度设置
  9. java 动态报表 sql,报表SQL
  10. 1、java 的安装及资料下载
  11. StringUtil类的常用方法
  12. c语言常用的100个程序,100个经典C语言程序,大家可以进来看看。
  13. VSTO:无法安装此应用程序,因为已安装具有相同标识的应用程序(亲测有效)
  14. 【校园卡】2020移动联通电信校园卡对比
  15. SUV世家广汽三菱,牵手微信企业号打造学习型企业
  16. THREE将左键改为平移右键改为旋转
  17. WEB应用防火墙(WAF启明设备)
  18. 问题——Word中一级标题离页眉很近
  19. 如何制定客户留存策略_运营参考|促活、拉新、留存、变现,7种策略教你做好用户运营...
  20. uniApp小程序转快应用

热门文章

  1. Creator3D:shader14_噪声消融
  2. oracle数据库进入控制台,oracle web浏览器无法打开控制台的解决办法
  3. 首屏加载从11s到1s,详解前端性能优化
  4. 常用CV数据集(持续更新中)
  5. abp 链接本地mysql_abp vNext 使用Mysql 数据库
  6. 李航第二章课后习题答案
  7. WebGL探索——抉择:实践方向(twgl.js、Filament、Claygl、BabylonJS、ThreeJS、LayaboxJS、SceneJS、ThinkJS、ThingJS)
  8. python excel转csv两列互换,python excel转换csv代码实例
  9. linux gcc忽略警告,gcc 禁止warning
  10. 秃头大牛一文竟然就把SpringCloudStream(SCS)给讲明白了?