Power Strings - POJ 2406 - Virtual Judgehttps://vjudge.net/problem/POJ-2406#author=SCU2018
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <cmath>
#include <map>
#include <cstdlib>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 2000010;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false)
char s[1000010];
ull a[1000010];
ull p[1000010];
ull base = 131;
ull mod = 212370440130137957ll;
int len;
void hashs() {
len = strlen(s + 1);
for (int i = 1; i <= len; i++) {
a[i] = (a[i - 1] * base + (ull)s[i]);
p[i] = p[i - 1] * base;
}
return;
}
bool judge(ull rec, int x) {
for (int i = 0; i + x <= len; i += x) {
if (rec != a[i + x] - a[i]*p[x]) {
return false;
}
}
return true;
}
int main() {
p[0] = 1;
while (scanf("%s", s + 1) && s[1] != '.') {
hashs();
for (int i = 1; i <= len; i++) {
if (len % i != 0) {
continue;
}
ull rec = a[i];
if (judge(rec, i)) {
printf("%d\n", len / i);
break;
}
}
}
return 0;
}