HDU 3746 Cyclic Nacklace

来源:互联网 发布:玉兔公子淘宝 编辑:程序博客网 时间:2024/05/21 05:06

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746
题目大意:给你一个字符串求将其变成最少循环两次的字符串所添加的字符个数
题目思路:首先找出你这个字符的循环节,然后再用循环节减去字符串长度取余循环节的值就是所要添加的字符数
代码:

#include<stdio.h>#include<string.h>using namespace std;const int Max=1000010;int next[Max];char s[Max];int l;void getnext(){    next[0]=-1;    int j=-1;    int i=0;    while(i!=l)    {        if(j==-1||s[i]==s[j])        {            i++;            j++;            next[i]=j;        }        else        {            j=next[j];        }    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%s",s);        l=strlen(s);        getnext();        int cd=l-next[l];//cd是字符节的长度        if(l%cd==0&&l/cd>1)//如果字符串正好是由几个字符节组成那么就输出0,如果就由一个字符节组成就不能输出0了        {            printf("0\n");        }        else        {          printf("%d\n",cd-l%cd);//输出所要添加的字符数        }    }    return 0;}
0 0