您的位置:首页 > 其它

bzoj 3620 似乎在梦中见过的样子(KMP)

2016-03-29 18:23 363 查看
【题目链接】

http://www.lydsy.com/JudgeOnline/problem.php?id=3620

【题意】

给定一个字符串,统计有多少形如A+B+A的子串,要求A>=K,B>=1。

【思路】

枚举左端点i,对字符串s[i..n]统计答案。

放个指针,然后枚举右端点j,如果指针超过长度一半则沿fail向前找,设指针为k。如果匹配则满足s[i..k]==s[j-k+1..j],最后判定一下长度限制。

【代码】

#include<cstdio>
#include<cstring>
using namespace std;

typedef long long ll;
const int N = 2e4+10;

int n,K;
ll ans;

int f
;
char s
;

void KMP(char *s) {
int n=strlen(s+1);
int j=0,now=0;
for(int i=2;i<=n;i++) {
while(j&&s[j+1]!=s[i]) j=f[j];
if(s[j+1]==s[i]) j++;
f[i]=j;

while(now&&s[now+1]!=s[i]) now=f[now];
if(s[now+1]==s[i]) now++;
while(2*now>=i) now=f[now];
if(now>=K) ans++;
}
}
int main()
{
scanf("%s%d",s+2,&K);
int n=strlen(s+2);
for(int i=1;i<=n;i++) KMP(s+i);
printf("%lld\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: