BZOJ 3620: 似乎在梦中见过的样子 [KMP 暴力]
Posted Candy?
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 3620: 似乎在梦中见过的样子 [KMP 暴力]相关的知识,希望对你有一定的参考价值。
题意:求所有形似于A+B+A 的子串的数量 , 且len(A)>=k,len(B)>=1
位置不同其他性质相同的子串算不同子串,位置相同但拆分不同的子串算同一子串
竟然是暴力........
枚举从哪里开始,和上题一样了
只不过本题$l$确定后一个$r$只能贡献一次,所以向前找第一个$2*j \le i-1$的位置判断$j \ge k$就行了
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int N=15005,MOD=1e9+7; int n,k,ans; char s[N]; int fail[N],sum[N]; void KMP(char s[],int n){ fail[1]=0; for(int i=2;i<=n;i++){ int j=fail[i-1]; while(j&&s[i]!=s[j+1]) j=fail[j]; fail[i]=s[i]==s[j+1]?j+1:0; } int j=0; for(int i=2;i<=n;i++){ while(j&&s[i]!=s[j+1]) j=fail[j]; if(s[i]==s[j+1]) j++; while((j<<1)>i-1) j=fail[j]; ans+=j>=k; } } int main(){ freopen("in","r",stdin); scanf("%s%d",s+1,&k); n=strlen(s+1); int _=n-(k<<1); for(int i=0;i<_;i++) KMP(s+i,n-i); printf("%d",ans); }
以上是关于BZOJ 3620: 似乎在梦中见过的样子 [KMP 暴力]的主要内容,如果未能解决你的问题,请参考以下文章