http://acm.hdu.edu.cn/showproblem.php?pid=3746
本题实际上就是求最少需要在结尾后面补几个字符才能凑成两个循环,即KMP的周期问题。
AC代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 100010;
char str[MAX];
int next[MAX];
void getnext(){
int i=0, j=-1,n=strlen(str);
next[0] = -1;
while(i < n){
if(j == -1 || str[i] == str[j]){
i++,j++;
next[i] = j;
}
else j = next[j];
}
}
int main(){
int m;
scanf("%d",&m);
while(m--){
scanf("%s",str);
int n;
n = strlen(str);
getnext();
int min_count = n - next[n];///字符串的循环节
if(min_count == n) printf("%d\n",n);
else if(n % min_count == 0) printf("0\n");
else printf("%d\n",min_count - n%min_count);///还需补充几个
}
///system("pause");
return 0;
}