KMP
WerKeyTom_FTD
我是一只来自中山纪念中学高三的oier,请多多指教
展开
-
beyond
题目大意给定两个长度为N字符串A与B,求出最大的L,使得A与B的前L个字符所组成的字符串循环同构。N<=2000000。推一推我们知道循环同构的一个特征:可以找到分界点分成两个字符串,然后交叉相同。例如aab与aba,我们可以把第一个字符串分割成a与ab,把第二个字符串分割成ab与a,那么他们交叉相同。 因此我们可以枚举A中分界点i,那么假设能找到B中分界点j,需要满足以下条件: 1、A的后缀i原创 2015-12-30 20:27:59 · 518 阅读 · 0 评论 -
[JSOI2016]无界单词
题目大意一个只由a和b组成的长度为n的字符串,如果kmp后next[n]=0,则称之为无界单词。给定n和m,求长度为n的无界单词个数以及第m小的。第一问正难则反! 设f[i]表示长度为i的无界单词数量。 那其实只需要算出有界单词数量,再从总数里减去即可。 枚举j为最小的使字符串前j个与后j个相等。 一个其实并不太显然的性质: j一定小于等于i/2。 为什么呢? 嘿嘿自己想想吧(是我懒得原创 2016-04-25 19:05:14 · 1229 阅读 · 0 评论 -
归途与征程
题目描述简单的思路把B串倍长,那么新的串任意一个长度为M的子串都是B的循环同构串。 按照*号把A串分成了若干段,然后每一段都与B串做一次KMP匹配。 具体的,设一个bz[i,j]表示B串第i个位置为开头是否能与第j段匹配。 那么统计答案就是枚举循环同构串的头部,不断往后跑。 当然,如果A串的头部或尾部不是∗*,那么要把它弄成∗*号。 跑的速度很慢达到m^2,所以预处理suc数组表示每个位置原创 2016-05-28 14:57:47 · 861 阅读 · 0 评论 -
字符串
题目大意求一个只由小写字母组成的长度为n的字符串中,有多少个不包含给定字符串的?DP我们可以考虑KMP 再处理nexti,c表示指针在第i个位置时接收字符c指针会移动到哪 fi,j表示填到第i个位置,目前指针为j 然后就可以转移#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(i=a;i<=原创 2016-11-12 11:25:52 · 419 阅读 · 0 评论 -
[51nod 1304]字符串的相似度
题目描述我们定义2个字符串的相似度等于两个串的相同前缀的长度。例如 “abc” 同 “abd” 的相似度为2,”aaa” 同 “aaab” 的相似度为3。 给出一个字符串S,计算S同他所有后缀的相似度之和。例如:S = “ababaa”,所有后缀为:ababaa 6 babaa 0 abaa 3 baa 0 aa 1 a 1S同所有后缀的相似度的和 = 6 + 0 + 3 + 0 + 1原创 2016-12-06 16:50:45 · 589 阅读 · 0 评论 -
字符串匹配
题目描述对于一个字符集大小为C的字符串P,我们可以将任意两种字符在P中的位置进行互换,例如P=abcba,我们交换a,b就变为bacab,交换a,d就变为dbcbd,交换可以进行任意次。若交换后P变为了字符串Q,则我们称Q与P是匹配的。 现在给定两个字符集大小为C的字符串S,T,请你求出S中有多少个连续子串与T是匹配的。水题一个字符串可以这样表示,一个位置首次出现某个字符标为0,否则标为与最近一个原创 2017-05-04 15:47:10 · 758 阅读 · 0 评论 -
[bzoj十连测第五场 B]可持久化字符串
题目大意一个S的循环节T表示为可以找到一个正整数k使得S是TkT^k的前缀。 一次操作会在字符串尾部添加一个字符,并且你需要在每次操作后输出最小循环节长度。 要求可持久化与在线。只跳log步我们知道结论,答案就是i-f[i]。 如何可持久化KMP? 我们考虑一种做法让一次更新MP只需要跳KMP步。 具体的,如果目前在j,我们看f[j]+1是否与i匹配。 如果匹配,那么f[i]=f[j]+原创 2016-07-14 09:50:59 · 1133 阅读 · 0 评论 -
[arc077f]SS
前言有趣的字符串题。 我是不是推出了什么和大家看起来不一样实质上一样的东西。题目大意定义AA表示两个一样的字符串A接在一起。 定义F(SS)=TT,TT是长度最小的满足条件的字符串且SS是TT的前缀。 给你小写字母串SS,求F10100(SS)F^{10^{100}}(SS)的区间[l,r]每个字母出现次数。有趣这显然是一道和border相关的题。 然后可以发现只考虑S的变化就行,不需要考虑原创 2017-11-04 09:45:03 · 1664 阅读 · 0 评论