KMP
我似乎复杂度写的不对。。。
因为位置相同只算一次,后缀数组什么的都不管用了,我们就暴力kmp,但是我写的是暴力跳。。。竟然过了。。。我写bzoj3670才发现。。。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 15010; int n, k, ans; int nxt[N]; char s[N]; void kmp(char *s, int len, int *nxt) { for(int i = 2, j = 0; i <= len; ++ i) { while(s[j + 1] != s[i] && j) j = nxt[j]; if(s[j + 1] == s[i]) ++ j; nxt[i] = j; } } int main() { scanf("%s%d", s + 1, &k); n = strlen(s + 1); for(int i = 1; i <= n; ++i) { char t[N]; int len = 0; for(int j = i; j <= n; ++j) t[++ len] = s[j]; kmp(t, len, nxt); for(int j = i; j <= n; ++j) { int p = j - i + 1; while(p * 2 >= j - i + 1 && p >= k) p = nxt[p]; if(p * 2 < j - i + 1 && p >= k) ++ ans; } } printf("%d ", ans); return 0; }