题意:给T个字符串,分别输出这T个字符串的最小循环节长度
求出前缀数组如果n-pi[n]整除n,则答案为n-pi[n],否则为答案为n。
如上图,如果红色的前缀与蓝色的后缀相同,则两段绿色的相同,以此类推,整个字符串可划分为n-pi[n]段相同的子串
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000;
int pi[maxn];
char a[maxn];
void getnext(int n) {
pi[1] = 0;
for (int i = 2, j = 0; i <= n; i++) {
while (j > 0 && a[i] != a[j + 1]) j = pi[j];
if (a[i] == a[j + 1]) j++;
pi[i] = j;
}
}
int main() {
int _;
scanf("%d", &_);
while (_--) {
scanf("%s", a + 1);
int n = strlen(a + 1);
getnext(n);
if (n % (n - pi[n]) == 0)
printf("%d
", n - pi[n]);
else
printf("%d
", n);
if (_) printf("
");
}
}