题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746
题意是给了一个字符串,然后问最少在开头或者末尾加多少个字符可以使这个字符串至少有两个循环节
要知道的是对于一个字符串中它的最短的循环节长度为L=len-Next[len],如果len%L==0就说明这个字符串完全由循环节构成比如abcabcabc这样,然后这道题的话我们要求出至少还要补上多少个字符,就是L-len%L。
AC代码:
#include <bits/stdc++.h>
#define maxn 100005
#define ll long long
using namespace std;
int T;
char s[maxn];
int Next[maxn];
void init(){
int j = 0, k = -1;
int len = strlen(s);
memset(Next, -1, sizeof(Next));
while(j < len){
if(k == -1 || s[j] == s[k]){
k ++;
j ++;
Next[j] = k;
}
else k = Next[k];
}
}
int main()
{
scanf("%d", &T);
while(T--){
scanf("%s", s);
init();
int len = strlen(s);
if(Next[len] == 0) {
printf("%d\n", len);
continue;
}
if(len % (len - Next[len]) == 0){
puts("0");
}
else{
int xx = len - Next[len];
printf("%d\n", xx - len % xx);
}
}
return 0;
}