KMP
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
poj3461 Oulipo(KMP)
求单词W在文本T中的出现次数。KMP裸题。#include #include #define N 1000005#define M 10005;char s[N],t[N];int n,m,fail[N];inline void getfail(){ int k=0;fail[1]=0; for(int i=2;i<=m;++i){ while(k&&t[k+1]!=t[i原创 2017-07-23 14:54:33 · 365 阅读 · 0 评论 -
bzoj4820 [Sdoi2017]硬币游戏(期望与概率+Gauss+kmp)
#include &lt;bits/stdc++.h&gt;using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 310inline int read(){ int x=0,f=1;char ch=getchar(); while(ch&lt;'0'||ch&gt;'9'){if(c...原创 2018-05-26 23:23:17 · 289 阅读 · 0 评论 -
loj103 子串查找(kmp/Hash模板题)
KMP模板题#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 1000010inline int...原创 2018-04-28 13:49:56 · 289 阅读 · 0 评论 -
bzoj3796 Mushroom追妹纸(SA+二分答案+kmp)
把s1和s2接在一起,求最长公共子串。二分答案就好了。。。此题就多一个判断,要求s3不能出现在公共子串里,那我们就预处理一下,用kmp求出s3在s2中出现的位置,处理成L数组,即可O(1)判断。原创 2017-08-26 16:58:07 · 556 阅读 · 0 评论 -
poj2185 Milking Grid(二维KMP+最小覆盖矩阵)
题意:在字符矩阵中找出一个最小子矩阵,使其多次复制所得的矩阵包含原矩阵。首先我们计算答案矩阵的列数,叫做宽。对每行都计算出所有的重复子串可能的长度,如:AAAABAAA,可能的重复子串长度为:5,6,7,8.如何计算呢?k从m开始,每次k-fail[k]即为重复子串长度,k=fail[k],直到k=0.每行中都出现过的最小长度即为答案矩阵的宽。(遇到一个可能长度就计数器+1,最后从小到大扫一遍,次原创 2017-07-26 11:38:06 · 428 阅读 · 0 评论 -
hdu1841(KMP)
就是求包含两个给定串的最短串。那长度最长是len1+len2,如果有重叠的就减掉就最短了。拿s2匹配一次s1,再拿s1匹配一次s2,记录最大重叠。#include #include #define N 1000010int tst,fail[N];char s1[N],s2[N];inline int max(int x,int y){return x>y?x:y;}inline原创 2017-07-25 22:18:11 · 378 阅读 · 0 评论 -
hdu2594(KMP水题)
把俩串联在一起,用‘#’隔开,答案就是fail[n]#include #include #define N 50010char s[N<<1],s2[N];int n,fail[N<<1];inline void getfail(){ int k=0;fail[1]=0; for(int i=2;i<=n;++i){ while(k&&s[k+1]!=s[i]) k=fail原创 2017-07-25 21:47:23 · 344 阅读 · 0 评论 -
hdu3613 Best Reward(KMP)
本题难度在于判断回文前缀和回文后缀。我们设原串为s1,把原串翻转后得到的串记为s2.以s1为模式串去匹配s2,最后匹配到的位置我们记为k,k就是最长回文前缀长度。根据fail的性质,每一次fail[k]到的位置都满足前缀回文。那么我们就把这些回文前缀都标记了。回文后缀同理,我们以s2为模式串去匹配s1,那么k就是s2的最长回文前缀长度,即s1的最长回文后缀长度。同样处理,把这些回文后缀标记。然后我原创 2017-07-25 21:25:23 · 326 阅读 · 0 评论 -
hdu4333 Revolving Digits(kmp+exkmp)
首先注意到如果数字是有循环节的,那么每次挪位会有重复的。所以我们先用kmp处理循环节,一共会有循环节长度个不同的合法串。我们把原串接在自己后面。那么每一次我们取的s[i..i+m-1]即为一个合法串(i=1...n)。用exkmp处理出会用到的n个串与原串的lcp,如果lcp>=m,则相等,否则比较第一个不同的位,即s[i+lcp]与s[lcp+1]。(我的exkmp写得实在是丑。。。凑合看吧。。原创 2017-07-25 20:41:46 · 310 阅读 · 0 评论 -
CF494B Obsessive String(KMP+DP)
这道题的题目真是太难读了。。。推了半天样例。其实就是让你求合法的集合数目。合法的集合定义为:1、集合中的所有串都是s的子串,且互不重叠 2、集合中的所有串都含有子串t。设串s长度为n,串t长度为m,我们首先用kmp在s中匹配t,匹配成功的位置我们打下标记flag[i]=1(s[i-m+1...i]=t[1..m]).以下角标均针对串s:设dp[i]表示合法且集合中最后一个子串为s[j.原创 2017-07-24 22:23:00 · 709 阅读 · 0 评论 -
CF471D MUH and Cube Walls(差分+KMP)
先差分,然后kmp匹配。注意m==1的情况。#include #include #define N 200010int s[N],t[N],n,m,fail[N],ans=0;inline int read(){ int x=0,f=1;char ch=getchar(); while(ch'9') {if(ch=='-')f=-1;ch=getchar();} whil原创 2017-07-24 18:11:23 · 440 阅读 · 0 评论 -
bzoj1355: [Baltic2009]Radio Transmission(kmp求循环节)
画画图发现,就是m-fail[m]。。。#include #include #define N 1000010int fail[N],m;char s[N]; inline void getfail(){ int k=0;fail[1]=0; for(int i=2;i<=m;++i){ while(k&&s[k+1]!=s[i]) k=fail[k]; if(s[k+1原创 2017-07-24 16:37:15 · 371 阅读 · 0 评论 -
hdu4300 Clairewd’s message(KMP)
这题描述简直惊人。其实就是说先给你一个密码表。然后给你一个不一定完整的串。原串满足前一半是密码,后一半是明码。要求你最小的补全这个串。首先我们要明确:设给的串长度为len,则1...(len+1)/2的字母一定是密码。我们可以把这一部分作为模式串,去匹配后面的串。(当然因为我们假定后面的串都是明码,所以我们要把后面的串翻译成密码来匹配)。我们假设最后一位匹配到了模式串的第k位。则说明1..len-原创 2017-07-24 15:13:09 · 710 阅读 · 0 评论 -
poj2406 Power Strings(kmp求循环节)
题目大意:求串s的最小循环节。用kmp处理出fail数组,len%(len-fail[len])如果为0,那么存在循环节,长度为len-fail[len],画一下图就可以自己证明啦#include #include #define N 1000010int fail[N],m;char s[N];inline void getfail(){ int k=0;fail[1]=0;原创 2017-07-24 14:02:49 · 480 阅读 · 0 评论 -
poj2752 Seek the Name, Seek the Fame(kmp)
从len开始,每一个fail[len]都可以。。不过要倒着输出。。原创 2017-07-28 22:26:42 · 264 阅读 · 0 评论 -
hdu4763 Theme Section(kmp)
题目大意:求最长的子串E,它既是串s的前缀又是后缀,还在串s的中间出现过(不能重叠)。直接从fai[len]开始枚举,在中间进行匹配,成功即可输出。#include #include #define N 1000010int tst,fail[N],m;char s[N];inline void getfail(){ int k=0;fail[1]=0; for(int i=原创 2017-07-23 23:34:46 · 324 阅读 · 0 评论 -
bzoj3670 [noi2014] 动物园(kmp改编)
解释写代码里了。。noi出这样的题可是很神奇哟。(像我这样的蒟蒻可能场上也不一定能写出来吧。。)#include #include #define ll long long#define N 1000010#define mod 1000000007int tst,fail[N],cnt[N],m;char s[N];inline void getfail(){ //c原创 2017-07-23 22:57:08 · 330 阅读 · 0 评论 -
bzoj1009 [HNOI2008]GT考试(KMP+DP+矩阵倍增)
f[i][j]表示前i位准考证号,匹配到了不吉利串第j位。我们考虑如何将f[i][j]转移到f[i+1][j].首先用kmp处理出fail数组,假设现在在做前i位匹配到了第j位,那么对于i+1位可能出现的每个字符我们都从j开始匹配,看能转移到哪里去。就是这样: f[0][0]=1; for(int i=0;i<=n;i++){ for(int j=0;j<m;j++){ for(i原创 2017-07-23 21:58:51 · 405 阅读 · 0 评论 -
CF346B Lucky Common Subsequence(LCS+kmp)
给定三个串A,B,C,求串A,B的lcs,要求不能包含C串作为子串。 f[i][j][k]表示A串前i个,B串前j个,lcs匹配到了C串的第K的个字母的lcs 转移和普通的lcs差不多,就是在往lcs上多加一个字符时,需要求一下新的lcs匹配到了C的那个字符,我们kmp预处理一下next数组即可快速找到。 复杂度O(n3)O(n3)O(n^3)#include <bits/stdc...原创 2018-06-25 20:33:50 · 554 阅读 · 0 评论