标签:bzoj3620 似乎在梦中见过的样子 kmp 暴力
#include <stdio.h>
int main()
{
puts("转载请注明出处[vmurder]谢谢");
puts("网址:blog.csdn.net/vmurder/article/details/44500477");
}
对于一个区间
我们枚举区间左端点,然后可以利用KMP在线性的时间内处理完所有的右端点对答案的贡献。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 16000
using namespace std;
int pre[N],fix,n,m,ans;
char s[N];
int main()
{
freopen("test.in","r",stdin);
int i,j,k;
scanf("%s%d",s+1,&m);
n=strlen(s+1);
int uplimit=n-m-m;
for(k=0;k<uplimit;k++)
{
// 数组右移k位
for(fix=0,i=2;i+k<=n;i++)
{
while(fix&&s[i+k]!=s[fix+1+k])fix=pre[fix];
if(s[i+k]==s[fix+1+k])fix++;
pre[i]=fix;
}
for(fix=0,i=m+1;i+k<=n;i++)
{
while(fix&&s[i+k]!=s[fix+1+k])fix=pre[fix];
if(s[i+k]==s[fix+1+k])fix++;
while(fix<<1>=i)fix=pre[fix];
if(fix>=m)ans++;
}
}
printf("%d\n",ans);
return 0;
}
标签:bzoj3620 似乎在梦中见过的样子 kmp 暴力
原文地址:http://blog.csdn.net/vmurder/article/details/44500477