KMP
显然给出的东西看起来就像border,因此有一个n^2的暴力KMP做法。我以为过不了,脑补了半天也没什么想法,然后发现题解就是n^2暴力???
#include<cstdio>
#include<cstring>
#define N 15555
using namespace std;
namespace runzhe2000
{
char s[N];
int n, k, next[N], ans;
void main()
{
scanf("%s%d",s+1,&k); n = strlen(s+1);
for(int i = 1; i <= n; i++)
{
int p = next[i] = i-1;
for(int j = i+1; j <= n; j++)
{
for(; s[p+1] != s[j] && p >= i; p = next[p]);
if(s[p+1] == s[j]) ++p;
next[j] = p;
}
p = i-1;
for(int j = i+1; j <= n; j++)
{
for(; s[p+1] != s[j] && p >= i; p = next[p]);
if(s[p+1] == s[j]) ++p;
for(; i+j-2*p-1 < 1 && p >= i; p = next[p]);
if(p >= i+k-1) ans++;
}
}
printf("%d\n",ans);
}
}
int main()
{
runzhe2000::main();
}