Codeforces 113 B

题意:有一个母串\(S\)以及两个串\(S_{begin}\)和\(S_{end}\),问\(S\)中以\(S_{begin}\)为开头并且以\(S_{end}\)为结尾的不同子串的个数。

思路1(后缀自动机):

首先肯定要把后缀自动机构建出来(第一次一遍敲对后缀自动机祭),然后我们考虑\(S_{begin}\)(和\(S_{end}\),是对称的,不做考虑)是不是在S中作为一个子串出现,如果出现了那么看它所对应的节点是哪个,打个标记(这个操作就是在自动机上沿着\(S_{begin}\)的每个字符的那条边走,最终走到哪个节点就是\(S_{begin}\)所对应的节点。)

然后找S的每一个长度为\(|S_{begin}|\)的子串,在自动机上走一遍,如果最终的节点是\(S_{begin}\)所对应的节点,那么就说明\(S_{begin}\)在此出现了,在这一位上打标记。

枚举要求的子串的开头结尾位置,如果开头的时候\(S_{begin}\)出现了,且在结尾的时候\(S_{end}\)出现了,那么这个子串就是属于答案的。将这个子串对应的节点的这个长度的标签打一下。(这里很需要注意!!!我在写的时候直接是将这个节点的标签打上了,这样非常不对,因为一个节点的定义是长度连续的一些子串!!!如果我们只是将这个节点打上标签,则会区分不出来长度不同的子串,导致答案减少很多。因此WA15了两次!)

看每个节点打了多少标签就好了。

思路2(后缀自动机):

首先也是构造后缀自动机。

然后我们可以找到\(S_{end}\)在自动机上对应的节点是什么。既然这个子串以 \(S_{end}\)为结尾,那么肯定是\(S_{begin}\)+\(S_{end}\)的一个后缀或\(S_{begin}\)+(一堆东西)+\(S_{end}\)。我们希望保证\(S_{begin}\)完整以便计算答案。所以我们需要将\(S_{end}\)的答案加到\(S_{begin}\)头上。

这里用的方法是这样的:

首先将end的值加到parent树的子树中(parent树就是将所有节点的link指向的值向它们自己连边后的树),

其次将所有的节点的值加到go的dag中这个节点的所有父亲们头上。

这样做的结果就是每一个节点\(u\)的值就是从\(u\)表示的某个子串开始之后以\(S_{end}\)为结尾的不同子串个数

那么答案就应该是\(S_{begin}\)所对应的节点。

但是如果直接这样交上去会\(wa30\),说明还有一些问题。

对此,freak93在最后做了一些处理,使得他的程序可以AC:

按照\(S_{end}\)的顺序在自动机上跑,如果当前节点已经跑到了\(S_{begin}\)应该到的位置,但是长度却不对,就是说跑到了这个起始串对应的节点的其它子串内,肯定不应该取。否则如果已经跑到了长度为\(|S_{begin}|\)的节点,但是并不是\(S_{begin}\)所对应的节点,那么就肯定得跑到现在已经到的串的后缀继续看(为什么会是后缀啊。。。我觉得应该是前缀?为后面的反例埋下伏笔)

应该就是这样的?看了一天不算特别懂。。。(这里完全不对。。。

P.S.:这里的做法其实是看\(S_{begin}\)是不是\(S_{end}\)的一个子串且不是它的前缀,如果是的话就说明从\(S_{begin}\)所代表的节点可以走到\(S_{end}\)所代表的节点,

要减去一些不对的答案,比如\(S_{begin}\)在\(S_{end}\)中出现的次数,还有如果是\(S_{begin}\)在之前出现过,即说明真正是有答案的,他应该不更改答案,但是他成功地减去了之前求出来的的答案\(\times\)出现次数,所以。。。(这个方法真的很不好想啊。。。正常人不会想这种吧。。。可能他异于常人。。。

所以就被我的反例干掉了

:反例(对于freak93在CF上AC的版本):

aabaab
aa
baab

这个的答案应该是1,但是这个程序输出了0。

我感觉好像他的后缀自动机敲错了

不是他的后缀自动机错了,而是我的调试语句写错了以至于我以为后缀自动机错了。。。

肯定是他最后修改对于\(wa30\)的错误的步骤错了(肯定不是选择跳到后缀嘛)(错误在上面说了)

思路3(后缀数组):

先用\(O(nlog^2n)\)的naive的做法求出后缀数组(就是在正常求的每一个\(2^h\)的阶段都直接sort)

然后把高度数组给求出来(我也不知道什么原理。。。反正求出来的就是排名为i的后缀和排名为i+1的后缀的最长公共前缀辣)

然后暴力(这个很有个性)地求出\(S_{begin}\)和\(S_{end}\)出现的位置们。

再想怎么补充不漏地记录答案。首先以i位置开始的子串肯定会和以i-1位置开始的子串有一段重复的,而这段重复的应该已经在i-1的时候算过了,所以i和i-1开始的后缀的最长公共前缀(高度数组)这一段不应该被i开始的子串记录。那么就很简单辣

【Codeforces 113B】Petr#的更多相关文章

  1. 【codeforces 760A】Petr and a calendar

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. 【Codeforces 986B】Petr and Permutations

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] n为奇数时3n和7n+1奇偶性不同 n为偶数时也是如此 然后交换任意一对数 逆序对的对数的奇偶性会发生改变一次 求出逆序对 对n讨论得出答案. ...

  3. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  4. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  5. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  6. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  7. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  8. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  9. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

随机推荐

  1. PHP cURL获取微信公众号access_token

    1.开发微信公众号首先要获取access_token,在运行代码前现在开发者设置中把本服务器IP添加到白名单中 public function index(){ $appId = 'wxd0e50fe ...

  2. lfs(systemv版本)学习笔记-第1页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一名linux爱好者,记录构建Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客 ...

  3. sql server:Monty Hall problem (蒙提霍尔问题)

    --------------------------------------------------------------------- -- Auxiliry Table of Numbers 数 ...

  4. 2018-01-19 Xtext试用: 5步实现一个(中文)JVM语言

    续上文Xtext试用: 快速实现简单领域专用语言(DSL). 基于官方教程: Five simple steps to your JVM language 达成如下语言: 它被Quan6JvmMode ...

  5. Linux 下的 PostgreSQL 数据库+文件通用自动备份脚本

    由于 Odoo(原名 OpenERP)自 8.0 以来会生成 CSS,并把附件存储在文件系统中,因此以前单纯备份数据库的脚本已经不够用了.出于实际部署的考虑,我专门写了个较为通用的 Odoo 备份脚本 ...

  6. SEO高手和SEO屌丝的八个区

    原文:http://www.it28.cn/sousuoyinqing/853085.html SEO这个行业并不规范,有些seo工程师可以拿着高薪,进行一些大型网站的seo工作,其实主要是UEO的工 ...

  7. 洗礼灵魂,修炼python(61)--爬虫篇—【转载】requests模块

    requests 1.简介 Requests 是用Python语言编写的第三方库,所以你需要pip安装,安装过程就略过了.它基于urllib,采用 Apache2 Licensed 开源协议的 HTT ...

  8. GsonUtil工具类

    import java.util.ArrayList; import java.util.List; import java.util.Map; import com.google.gson.Gson ...

  9. VS2015安装与C++进行简单单元测试

    1:VS2015是微软最新发布的编译器,http://www.itellyou.cn/这是我们的北航大神助教提供的下载网址,以前我们都是自己在网上找,找到的总不是那么如意,这下大神助教提供的网址就好好 ...

  10. golang的reflection(转)

    作者:BGbiao 链接:https://www.jianshu.com/p/42c19f88df6c 來源:简书 反射reflection 可以大大提高程序的灵活性,使得interface{}有更大 ...