YbtOJ KMP算法课堂过关 例4 子串拆分【KMP】
作者:互联网
思路
这道题首先可以发现要找最大字符串的子串来看是否有ABA型,然后直接超时,发现可以直接枚举左端点,大的子串可以包含小的右端点子串。于是枚举每一个左端点,然后求next,把这个子串中所有ABA找出来,然后找的过程也可以用 k = n e x t [ k ] k=next[k] k=next[k] 来找,当然一个ABA还要满足题目中的两个条件才行。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int lo,nxt[20010],nxt2[20010];
char s[20010],zn[20010];
int ans;
int main()
{
scanf("%s",s+1);
cin>>lo;
int longs=strlen(s+1);
for(int i=1; i<=longs; i++)
{
memset(nxt,0,sizeof(nxt));
memset(zn,0,sizeof(zn));
for(int j=1; i+j-1<=longs; j++)
zn[j]=s[i+j-1];
int k=0,longzn=strlen(zn+1);
for(int j=2; j<=longzn; j++)
{
while(k>0&&zn[k+1]!=zn[j])
k=nxt[k];
if(zn[k+1]==zn[j])
k++;
nxt[j]=k;
}
k=0;
for(int j=2; j<=longzn; j++)
{
while(k>0&&zn[k+1]!=zn[j])
k=nxt[k];
if(zn[k+1]==zn[j])
k++;
while(k*2>=j)
k=nxt[k];
if(k>=lo)
ans++;
}
}
cout<<ans;
return 0;
}
标签:子串,nxt,zn,lo,int,YbtOJ,20010,KMP 来源: https://blog.csdn.net/Jackma_mayichao/article/details/115025045