HDU_3746Cyclic Nacklace

//题意:为你最少加几个字母(字母全为小写),可以让整个字符存在循环(最少两个循环)

思路:先求出最少循环节:len-next[len].在用kmp算法求出next数组后,len-next[len]的值就是该字符串的最小循环节,该字符串的其他循环节都是它的倍数,如果len恰好是len-next[len]的整数倍,那么该字符串就是个power string;如果next[len]为0,表示该字符串是非循环的;否则,按照len-next[len]的循环节,补齐最后一个循环节即为使该字符串成为power string的最小添加字符个数。

AC代码:

#include<stdio.h>
#include<string.h>
#define max 100005
char t[max]; int next[max]; int len; void get_next() { int i=0; int j=-1;
    next[0]=-1; while(i<len) { if(j==-1||t[i]==t[j]) {
            i++;
            j++;
            next[i]=j; } else {
            j=next[j]; } } } int main() { int x;
    scanf("%d",&x); while(x--) {
        scanf("%s",t);
        len=strlen(t); for(int i=0;i<=len;i++) {
            next[i]=0; } int j,k;
        get_next();
        j=len-next[len]; if(j<len&&len%j==0) {
            printf("0\n"); } else {
            printf("%d\n",j-next[len]%j); } } return 0; }

你可能感兴趣的:(HDU_3746Cyclic Nacklace)