枚举左端点,然后跑KMP,统计一下就好了= =。
/* Pigonometry */
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 15005;
int len, k, fail[maxn];
char str[maxn];
inline void getfail(int pos) {
for(int i = 2, j = 0; pos + i <= len; fail[i++] = j) {
for(; j != 0 && str[pos + i] != str[pos + j + 1]; j = fail[j]);
if(str[pos + i] == str[pos + j + 1]) j++;
}
}
inline int calc(int pos) {
getfail(pos);
int res = 0;
for(int i = k + 1, j = 0; pos + i <= len; i++) {
for(; j != 0 && str[pos + i] != str[pos + j + 1]; j = fail[j]);
if(str[pos + i] == str[pos + j + 1]) j++;
for(; (j << 1) >= i; j = fail[j]);
if(j >= k) res++;
}
return res;
}
int main() {
scanf("%s%d", str + 1, &k); len = strlen(str + 1);
int upb = len - k - k, ans = 0;
for(int i = 0; i < upb; i++)
ans += calc(i);
printf("%d\n", ans);
return 0;
}