【Loj #10047. 「一本通 2.2 练习 3」似乎在梦中见过的样子】题解
本文搬运自本人初中博客园博客,若图片加载不出来,可到原文查看:https://www.cnblogs.com/zhangtingxi/p/15812840.html
题目
原题来自:2014 年湖北省队互测 Week2
「Madoka,不要相信 QB!」伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约。
这是 Modoka 的一个噩梦,也同时是上个轮回中所发生的事。为了使这一次 Madoka 不再与 QB 签订契约,Homura 决定在刚到学校的第一天就解决 QB。然而,QB 也是有许多替身的(但在第八话中的剧情显示它也有可能是无限重生的),不过,意志坚定的 Homura 是不会放弃的——她决定消灭所有可能是 QB 的东西。现在,她已感受到附近的状态,并且把它转化为一个长度为 的字符串交给了学 OI 的你。
现在你从她的话中知道,所有形似于 的字符串都是 QB 或它的替身,且 (位置不同其他性质相同的子串算不同子串,位置相同但拆分不同的子串算同一子串),然后你必须尽快告诉 Homura 这个答案——QB 以及它的替身的数量。
注:对于一个字符串 , 表示 的长度。
思路
暴力 :
枚举每个位置为开头,然后KMP匹配。
那么对于当前匹配出来的,是否可行呢?
对于任意公共前后缀,我们在这题中并不希望它最长,而希望它在满足长度 的情况下越短越好。
如下图中,那么我们先确定 的最长前后缀结尾在 ,也就是 与 ,匹配。
而这时,如果 中有两个红色部分匹配,那么蓝色不分必然也与红色部分匹配。
因此,如果红色部分长度大于 ,则此时 就是红色和蓝色部分,而不是 与 。
而如果红色部分没有长于 ,则我们判断 是否长于 ,这是第二种情况。

总结
这道题是一道不错的字符串匹配题, 能够只能说明数据弱。
这题真正的核心思想在于要是匹配长度大于 时最小,我们可以通过转移过来的那个字符与当前长度分类讨论,以后遇到类似问题也可以往转移过来那个点来思考。
Code
1 | // Problem: 1469:似乎在梦中见过的样子 |





