KMP
穷源溯流
路很长,尽管走便是。
展开
-
The 18th Zhejiang Provincial Collegiate Programming Contest L.String Freshman(KMP)
const int N=2e5+5; int n,m,_; int i,j,k; char a[N]; int f[N];void getfail(char *s){ f[0]=f[1]=0; int len=strlen(s); for(int i=1;i<len;i++){ int j=f[i]; while(j && s[i]!=s[j]) j=f[j]; ...原创 2021-05-01 18:00:43 · 1013 阅读 · 1 评论 -
洛谷 CF25E Test(KMP)
#include <bits/stdc++.h>#define dbg(a) cout<<#a<<" : "<<a<<endlusing namespace std;const int N=1e5+5;char s[4][N];int f[4][N];int minn=1e9;void getfail(char *s,int id){ f[id][0]=f[id][1]=0; int len=strlen...原创 2021-04-23 18:41:18 · 229 阅读 · 0 评论 -
洛谷 UVA10298 Power Strings(KMP)
const int N=1e6+5; int n,m; int i,j,k; char s[N]; int f[N];void getfail(char *s){ f[0]=f[1]=0; int len=strlen(s); for(int i=1;i<len;i++){ int j=f[i]; while(j && s[i]!=s[j]) j=f[j]; ...原创 2021-04-19 10:36:33 · 198 阅读 · 0 评论 -
UVa 11475 Extend to Palindrome(KMP+思维)
Sample InputaaaaabbaamanaplanacanalxyzSample Outputaaaaabbaamanaplanacanalpanamaxyzyx给出一个字符串,将其变为最短的回文串通过观察样例发现每一个字符串都为 \\\\\\A 的形式,其中 A 为回文字符串,计算非回文串的长度并不是很好计算,但是如果知道 A 的长度同样可以解决问题我们将字符串反转 A///////,求 A 的长度,那么将字符串变为 A////////\\\\\\\\...原创 2021-02-13 09:30:41 · 372 阅读 · 0 评论 -
HDU 3374 String Problem(KMP+最小表示法)
对于给出的每一个字符串,可以将其任意旋转,输出其字典序最小的位置及出现次数,字典序最大的位置以及出现次数出现次数是指:将字符串 s 旋转可以得到的与 s 相等的个数用最小表示法和最大表示法表示出字典序最大和最小的两个个字符串对于出现个数,例如: abcabcab,其生成元为 abc ,n-next[n] 为其长度,但是其包含不完整的生成元 ab,那么出现次数只能为 1#include <iostream>#include <cstdio>#inc...原创 2021-02-10 16:16:28 · 165 阅读 · 0 评论 -
洛谷 P2375 [NOI2014] 动物园(KMP+DP)
const ll mod=1e9+7;const int N=1e6+5; int n,m,t; int i,j,k; char s[N]; int f[N]; int dp[N];void getfail(char *s){ f[0]=f[1]=0; dp[0]=0,dp[1]=1; for(int i=1;s[i];i++){ int j=f[i]; while(j &&...原创 2021-02-07 22:38:03 · 475 阅读 · 0 评论 -
洛谷 P3435 [POI2006]OKR-Periods of Words(KMP+记忆化搜索)
题意不是很明确,我来解释一下样例 的前缀分别有,其中 Q 的长度分别为题目清楚之后,当 QQ 的前缀为 a 的时候,a-Q (即后缀)必须与 Q 的某前缀相同,Q 近可能大,所以 a-Q 尽可能小for(int i=2;i<=n;i++){ res=f[i]; while(f[res]) res=f[res]; if(res) ans+=i-res;}其中 f[] 为 next[] ,但是这样会超时,所以利用记忆化搜索, res[i] 表示到 i...原创 2021-02-06 16:32:28 · 783 阅读 · 0 评论 -
HDU 4300 && 多校2012 Clairewd’s message(KMP+思维)
先给出 26 个字母,表示 26 个字母分别对应的密文在给出一个字符串,要求添加字符或不添加,保证构造之后的字符串前半部分是密文,后半部分是明文要求添加的字符尽可能少题目还是比较有难度的,首先假设给出的字符串长度为 n,那么密文的长度一定 >=n/2,那么如果 n 是奇数,密文长度 >n/2这样将前半段密文转化为明文,所求的 next[n] 即为真正明文的长度,因为长度不可以超过 n/2但是如果字符串比较特殊,那么需要利用 next 的性质,将明文长度减小...原创 2021-02-05 15:48:01 · 268 阅读 · 0 评论 -
HDU 3336 Count the string(KMP+DP)
求字符串中的每一个前缀在字符串中的出现个数样例解释 :a 出现两次,ab 两次 ,aba 一次,abab 一次next[i] 不为 0,说明出现过前缀,改前缀的贡献会在出现一次,所以 dp[i]=dp[next[i]]+1#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define rush() int T;c...原创 2021-02-05 11:03:19 · 229 阅读 · 0 评论 -
HDU 2594 Simpsons’ Hidden Talents(KMP)
给出两个字符串 a,b,求 a 的前缀 = b 的后缀的最大长度,若 ans>0 ,输出相同的字符串将两个字符串合并起来,利用 next 数组的性质,可以自动匹配模式串相同的后缀和前缀若 next[n]>min(n,m) 说明答案不存在,需要将答案减小。#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#defin...原创 2021-02-05 10:20:43 · 221 阅读 · 0 评论 -
HDU 1358 Period(KMP)
求一个字符串中所有的循环串,对于每一个循环串要求周期 T>1,输出循环串最后一个字母的下标和循环串的周期#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define rush() int T;cin>>T;while(T--)#define ms(a,b) memset(a,b,sizeof a)...原创 2021-02-04 11:40:01 · 167 阅读 · 0 评论 -
HDU 3746 Cyclic Nacklace(KMP)
KMP 算法中知道 x=n-next[n] 为最小循环节,那么 n/x 为循环次数,如果 n%x!=0,说明 x 并不是循环节判断 n/x 是否大于等于 2 即可#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define rush() int T;cin>>T;while(T--)#define ms...原创 2021-02-04 11:08:16 · 198 阅读 · 0 评论 -
洛谷 P4391 [BOI2009]Radio Transmission 无线传输(KMP)
假设字串长度为 x,字符串从 1 开始计数next[1]=next[2]=……next[x]=0 next[x+1]=1 next[x+n]=n 发现从 x+1 位置开始,next 数组逐渐递增 1所以答案为 n-next[n]const int N=1e6+5; int n,m; int i,j,k; char a[N]; int f[N];void getfail(char *s){ int len=strlen(s); ...原创 2021-02-04 10:18:11 · 375 阅读 · 0 评论 -
HDU 1686 Oulipo(KMP)
给出两个字符串 t,s 求 s 中有多少个 t(包括重叠部分字符串)#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define ss(a) scanf("%s",a)#define pd(a) printf("%d\n",a)#define rush() int T;cin>>T;...原创 2021-02-03 22:03:23 · 205 阅读 · 0 评论 -
HDU 2087 剪花布条(KMP)
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define ss(a) scanf("%s",a)#define pd(a) printf("%d\n",a)using namespace std;typedef long long ll;const int N=1e3+5; int n,m; ...原创 2021-02-03 21:36:32 · 205 阅读 · 0 评论