题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746

题意:

最少还要加多少珠子能使手链变成循环手链。

思路:

这题和HDU的1358题类似,求出字符串的最小循环节即可。

My  Code:

#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char ch[100005];
int nt[100005];
int len;
void GetNext()
{
    int j = 0,k = -1;
    nt[0] = -1;
    while(j < len)
    {
        if(k == -1 || ch[j]== ch[k])
        {
            j++; k++;
            nt[j] = k;
        }
        else k = nt[k];
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",ch);
        len = strlen(ch);
        GetNext();
        if(nt[len] == 0)
            printf("%d\n",len);
        else
        {
            int ans = len - nt[len];///ans记录的是最小循环子序列的长度
            if(len % ans == 0)///如果除不尽的话(即有余数)说明不是一个手链,如果len%ans=0的话,则说明此串是由k个最小循环子序列组成的,即此串本身就是一个手链
                printf("0\n");
            else
                printf("%d\n",ans - len % ans );///用最小循环子序列-最小前后缀就是要增加的序列长度(其中len%ans算出来的是最小循环子序列中已有的一部分)
        }
    }
}