这题之前写是写的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;}
    }
}