HDU-3746 Cyclic Nacklace (活用KMP中next数组)

来源:互联网 发布:access sql 编辑:程序博客网 时间:2024/05/24 05:09

                                          

Cyclic Nacklace

题意,给你一个字符串,求再添加多少个字符可以成为一个循环字符串

题目链接

这道题的精髓就在于活用next数组

这道题以前做过,但是由于是看了题解,理解的不是很透彻

这次进行全面分析

这道题先求解next数组

而next数组的作用是用来求循环节的长度

循环节的长度为  len-next【i】

找到了循环长度了,那么看一下len中有多少个循环节,如果正好整数个,那么输出0

如果不是整除,那么缺多少补齐就可以了

注意~~~~~~~我的next数组和网上的代码稍微有些不一样·······具体输出next数组看一下不同

#include<stdio.h>#include<string>#include<iostream>#include<string.h>using namespace std;const int maxn=1000000+10;char a[maxn],b[maxn];int nextl[maxn];int abs(int a){    if(a<=0)        return -a;    else        return a;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%s",a);        int len=strlen(a);        memset(nextl,0,sizeof(nextl));        int i=0,j=1;        nextl[0]=0;        while(j<len)        {            if(a[i]==a[j])            {                nextl[j]=i+1;                i++,j++;            }            else if(a[i]!=a[j]&&i!=0)            {                i=nextl[i-1];            }            else            {                j++;            }        }//        for(int i=0;i<len;i++)//        {//            printf("%d ",nextl[i]);//        }//        printf("\n");        int z=len-nextl[len-1];//        printf("%d\n",nextl[len-1]);        if(len%z==0&&z!=len)            printf("0\n");        else            printf("%d\n",z-len%z);    }}