网址如下:
Periodic Strings - UVA 455 - Virtual Judge
(第三方网址)
一道对Z函数(扩展KMP)的应用的题
算法方面可以参考:Z 函数(扩展 KMP) - OI Wiki
代码如下:
#include<vector>
#include<string>
#include<cstdio>
#include<iostream>
using namespace std;
int N;
int getAns(string s){
int n = s.size(); vector<int> z(n, 0);
for(int i = 1, l = 0, r = 0; i < n; i++){
if(i <= r && z[i - l] < r - i + 1) z[i] = z[i - l];
else{
z[i] = max(0, r - i + 1);
while(i + z[i] < n && s[z[i]] == s[i + z[i]]) z[i]++;
}
if(i + z[i] - 1 > r) l = i, r = i + z[i] - 1;
if(!(n % i) && i + z[i] == n) return i;
}
return n;
}
int main(void)
{
scanf("%d", &N); getchar();
for(int i = 0; i < N; i++){
getchar(); string s;
getline(cin, s);
if(i) putchar('\n');
printf("%d\n", getAns(s));
}
return 0;
}