这题之前写是写的kmp。现在重新用hash写了一遍,用hash的话就枚举约数,然后看每一段长度为该约数的hash值一不一样就好。kmp做一做也行。。kmp的话答案就是。
但是这个复杂度不是很会算...大概是不可能跑满的
这里给出hash代码。
#include <bits/stdc++.h> using namespace std; #define N 1000010 #define ull unsigned long long #define base 233 ull h[N], p[N], ha; char s[N]; int n; bool check(int x) { for(int i = 2 * x; i <= n; i += x) if(h[i] - h[i - x] * p[x] != h[x]) return 0; return 1; } int main() { while(~scanf("%s", s + 1)) { if(s[1] == '.') break; n = strlen(s + 1); p[0] = 1; for(int i = 1; i <= n; ++i) { h[i] = h[i - 1] * base + (ull)s[i]; p[i] = p[i - 1] * base; } for(int i = 1; i <= n; ++i) if(n % i == 0) if(check(i)) {printf("%d\n", n / i); break;} } }