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

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。

Solution

$SAM$板子……

Code

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define N (20000007)
 5 using namespace std;
 6 
 7 int n,m,v[109];
 8 char s[N];
 9 
10 struct SAM
11 {
12     int p,q,np,nq,last,cnt;
13     int fa[N],son[N][4],step[N];
14     SAM() {last=cnt=1;}
15     
16     void Insert(int x)
17     {
18         p=last; np=last=++cnt; step[np]=step[p]+1;
19         while (p && !son[p][x]) son[p][x]=np, p=fa[p];
20         if (!p) fa[np]=1;
21         else
22         {
23             q=son[p][x];
24             if (step[q]==step[p]+1) fa[np]=q;
25             else
26             {
27                 nq=++cnt; step[nq]=step[p]+1;
28                 memcpy(son[nq],son[q],sizeof(son[q]));
29                 fa[nq]=fa[q]; fa[q]=fa[np]=nq;
30                 while (son[p][x]==q) son[p][x]=nq, p=fa[p];
31             }
32         }
33     }
34     int Query(char s[])
35     {
36         int len=strlen(s),ans=0,x=1;
37         for (int i=0; i<len; ++i)
38         {
39             if (!son[x][v[s[i]]]) return ans;
40             ++ans; x=son[x][v[s[i]]];
41         }
42         return ans;
43     }
44 }SAM;
45 
46 int main()
47 {
48     v['E']=0; v['S']=1; v['W']=2; v['N']=3;
49     scanf("%d%d%s",&n,&m,s);
50     for (int i=0; i<n; ++i) SAM.Insert(v[s[i]]);
51     for (int i=1; i<=m; ++i) scanf("%s",s), printf("%d\n",SAM.Query(s));
52 }

转载于:https://www.cnblogs.com/refun/p/10520725.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 之后,再玩玩 Stable-Diffusion

前些天体验的 ChatGPT 主要用来进行文本方面的处理&#xff0c;那么图片生成有没有这样的 AI 工具 呢&#xff1f;答案是肯定的。例如&#xff1a;和菜头公众号的题图和文章中的插图大多都是使用 Stable-Diffusion 的 AI 图形生成工具创作的。顺着 Stable-Diffusion 搜索了下相…

渗透测试入门DVWA 教程1:环境搭建

首先欢迎新萌入坑。哈哈。你可能抱着好奇心或者疑问。DVWA 是个啥&#xff1f; DVWA是一款渗透测试的演练系统&#xff0c;在圈子里是很出名的。如果你需要入门&#xff0c;并且找不到合适的靶机&#xff0c;那我就推荐你用DVWA。 我们通常将演练系统称为靶机&#xff0c;下面请…

指派问题(匈牙利算法)

问题描述&#xff1a; 在生活中经常遇到这样的问题&#xff0c;某单位需完成n项任务&#xff0c;恰好有n个人可承担这些任务。由于每人的专长不同&#xff0c;各人完成任务不同(或所费时间)&#xff0c;效率也不同。于是产生应指派哪个人去完成哪项任务&#xff0c;使完成n项任…

移动硬盘改台式机硬盘_如何在台式机或移动设备上离线使用Google云端硬盘

移动硬盘改台式机硬盘If there’s any drawback to using cloud-based services for all your productivity and organization needs, it’s that if you can’t get an Internet connection, you’re basically out of luck. 如果使用基于云的服务来满足您的所有生产力和组织需…

你可能不知道的容器镜像安全实践

大家好&#xff0c;我是Edison。最近在公司搭建CI流水线&#xff0c;涉及到容器镜像安全的话题&#xff0c;形成了一个笔记&#xff0c;分享与你&#xff0c;也希望我们都能够提高对安全的重视。时代背景近年来应用程序逐步广泛运行在容器内&#xff0c;容器的采用率也是逐年上…

从零基础到拿到网易Java实习offer,谈谈我的学习经验

微信公众号【程序员江湖】作者黄小斜&#xff0c;斜杠青年&#xff0c;某985硕士&#xff0c;阿里研发工程师&#xff0c;于2018 年秋招拿到 BAT 头条、网易、滴滴等 8 个大厂 offer个人擅长领域 &#xff1a;自学编程、技术校园招聘、软件工程考研&#xff08;关注公众号后回复…

【Win 10 应用开发】UI Composition 札记(二):基本构件

在上一篇中&#xff0c;老周用一个示例&#xff0c;演示了框架视图的创建过程&#xff0c;在本篇中&#xff0c;老周将给大伙伴们说一下 Composition 构建 UI 的一些“零件”。 UI Composition 有一个核心类——对&#xff0c;就是 Compositor 类&#xff0c;它是总生产车间&am…

禁用内置键盘_如何禁用Windows 10的所有内置广告

禁用内置键盘Windows 10 has a lot of built-in advertising. This isn’t just about the free upgrade offer: Even if you purchase a new PC that comes with a Windows 10 license or spend $200 for a copy of Windows 10 Professional, you’ll see ads in your operati…

zbb20180710 maven Failed to read artifact descriptor--maven

Failed to read artifact descriptor--maven2016年09月10日 13:30:46阅读数&#xff1a;13036在开发的过程中,作为新手,经常遇到Maven下载依赖的时候,"Failed to read artifact descriptor for xxx:jar"的错误对于这种非业务相关的问题,耽误时间非常不效率,看到网站很…

震惊!顶着 39.5℃高烧 ,我和这哥俩都聊了些啥?

这是头哥侃码的第271篇原创上周三&#xff0c;我邀请了两位嘉宾进入直播间&#xff0c;即便自己顶着 39.5 度的高烧&#xff0c;还是强打精神与这哥俩聊了俩小时。相信关注我的朋友们都知道&#xff0c;我是头哥侃码的主理人&#xff0c;同时也是上海TGO上海分会董事会成员。赵…

CAS原理分析及ABA问题详解

什么是CAS CAS即Compare And Swap的缩写&#xff0c;翻译成中文就是比较并交换&#xff0c;其作用是让CPU比较内存中某个值是否和预期的值相同&#xff0c;如果相同则将这个值更新为新值&#xff0c;不相同则不做更新&#xff0c;也就是CAS是原子性的操作(读和写两者同时具有原…

在Windows Mobile模拟器(Emulator)建立网络连接

因为想使用Windows Mobile Emulator进行网络通信程序的测试&#xff0c;所以找方法配置Emulator的网络连接。在网上找了一些文章&#xff0c;很多都说需要安装Virtual PC 2007. 例如下面的文章Enable Network Connection Windows Mobile 6 Emulator 如果需要 Virtual PC 2007 可…

api游戏编程鼠标选择拖动_如何选择合适的游戏鼠标

api游戏编程鼠标选择拖动You don’t need a gaming mouse to play PC games—just about any mouse with two buttons and a wheel will play anything you want it to. But that’s no reason to deny yourself the wonderful variety of gaming mouse designs on the market.…

iOS - 上架的APP 生成二维码下载

1.首先打开苹果App Store商店进入到里面&#xff0c;找到需要打开链接地址的应用程序&#xff0c;例如&#xff1a;百度。2. 在App Store商店里面先点击一下应用程序图标&#xff0c;再按一下…分享按钮。 3. 接着选择分享APP&#xff0c;再点击拷贝链接地址&#xff0c;将应用…

Rsa2加密报错java.security.spec.InvalidKeySpecException的解决办法

最近在和支付宝支付做个对接&#xff0c;Java项目中用到了RSA2进行加解密&#xff0c;在加密过程中遇到了错误&#xff1a; java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence 代码执行到这句…

浅析领域驱动设计

1.概要DDD&#xff08;Domain-driven design&#xff0c;模型驱动设计&#xff09;是一种软件设计的指导思想&#xff0c;而非固定的一套公式化开发模板&#xff08;这样就会导致网络上出现各种基于自己或业务上的理解而产出的DDD落地的实现&#xff0c;会让很想学习的开发者迷…

Delphi实现的透明阴影以及蒙版效果菜单

QQ2010的皮肤控件目前实现了一部分&#xff0c;看到有些软件的菜单&#xff0c;都有阴影&#xff0c;透明等效果&#xff0c;于是开始重新实现菜单控件&#xff0c;QQ2009版的菜单控件&#xff0c;是自己从TComponent继承了完全模拟实现的一个菜单&#xff0c;虽然实现了菜单控…

cortana搜索框_如何在Windows 10任务栏上隐藏Cortana搜索框

cortana搜索框One of the most talked about features in the latest version of Windows 10 was the Cortana personal assistant that is integrated directly into the taskbar. But what if you don’t want to waste all that taskbar space? 最新版本的Windows 10中最受…

Kotlin 基础 - 数据类型

一、Boolean 类型 Boolean 值有两个值&#xff0c;分别为 true 或 false。多数情况下&#xff0c;Kotlin 中的 Boolean 相当于 Java 中的基本类型 boolean&#xff0c;只有在必要的情况下才会装箱成为 Java 中的装箱类型 Boolean。这一切都是交由编译器来完成&#xff0c;我们无…

全框眼镜拆卸镜片方法分享

全框眼镜拆卸镜片方法分享http://www.iqiyi.com/w_19ru97p1n9.html 很多直接用手掰就成&#xff08;眼镜布&#xff09; 转载于:https://www.cnblogs.com/OceanF/p/9288411.html