
KMP
winhcc
这个作者很懒,什么都没留下…
展开
-
poj 1961
KMP 求循环节next[i]表示前i个字符中最长的相同前缀后缀,因而i %(i-next[i]) == 0时代表前i个字符构成了循环节,但是next[i]不能为0,例如abcde,next[5] = 0 ,单很明显该字符串不是循环的串#include <cstdio>int n,next[1010101],cas;char a[1010101];void getN(){...原创 2019-03-14 21:27:26 · 206 阅读 · 0 评论 -
poj 2406
只有求整个字符串的循环节数,可知长为len的字符串循环节长度为len - next[len],所以循环节数就是len / (len - next[len])#include <cstdio>#include <cstring> char a[1010101];int next[1010101];void getN(int m){ int i,j; j = ...原创 2019-03-14 21:33:08 · 135 阅读 · 0 评论 -
hdu 3336
求一个字符串的不同前缀在自身串中出现的次数,用扩展kmp即可,自己匹配自己。求出next数组后,只有把next中各项相加即可,假设next[i] = k,那么可知s[i,…,i+k-1] == s[0,…,k-1]所以以i为起点的后面的字串可以匹配k个前缀#include <cstdio> #include <algorithm>const int mod = ...原创 2019-03-14 21:39:57 · 136 阅读 · 0 评论 -
hdu 3746
kmp循环节问题,分几种情况讨论一下即可。但是一开始写的是max(0,len-2*net[len])不知错在哪里。。#include <cstdio>#include <algorithm> #include <cstring>using namespace std;int t,len,net[100010];char s[100010];...原创 2019-03-15 16:49:57 · 115 阅读 · 0 评论 -
hdu 2594
给两个串a和b,求a的前缀和b的后缀最长的部分把a,b拼接起来,这正是KMP中next数组的含义。但是这题还有个坑,如a是cdc,b是d,答案是0,而直接输出next[len]是2,原因就是拼接时,会有一部分会构成循环,所以长度一定不大于min(a.len,b.len)利用next数组的特性,可以倍增求出最小的next值#include <cstdio>#include &l...原创 2019-05-02 13:28:44 · 216 阅读 · 0 评论 -
hdu 4763
求一个最长的字串s,原串中有sasbs的形式。枚举是会TLE滴,所以要预处理一下原来的串,can[i]表示能否构成长度为i的字串的一前一后的形式,这用next数组即可求得,然后枚举中间的点判断能否满足三段式的结构#include <cstdio>#include <cstring>#include <algorithm> const int N = ...原创 2019-05-04 22:35:26 · 186 阅读 · 0 评论