这题之前写是写的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;}
}
} 
京公网安备 11010502036488号