【BZOJ3620】似乎在夢中見過的樣子【KMP】【暴力】
阿新 • • 發佈:2019-01-04
列舉左端點,然後跑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; }