题目链接:子串拆分
分析
枚举子串,求这个子串的 next 数组,而且只要两个串不重合且长度大于 k 就可以计入答案
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char s[15001],s1[15001];
int kk,n,ans;
int next[15001];
int main()
{
scanf("%s",s1+1);
cin>>kk;
n=strlen(s1+1);
for(int i=1;i<=n;i++)
{
memset(s,0,sizeof(s));
for(int j=1;j+i-1<=n;j++)
{
s[j]=s1[j+i-1];
}
int wx=strlen(s+1);
memset(next,0,sizeof(next));
int j=0;
for(int k=2;k<=wx;k++)
{
while(j&&s[k]!=s[j+1])j=next[j];
if(s[k]==s[j+1]) j++;
next[k]=j;
}
j=0;
for(int k=1;k<=wx;k++)
{
while(j&&s[k]!=s[j+1])j=next[j];
if(s[k]==s[j+1]) j++;
while(j*2>=k) j=next[j];
if(j>=kk) ans++;
}
}
cout<<ans;
return 0;
}