hdu 3764 (Cyclic Nacklace)next数组求循环周期

题目大意:给出你一个字符串比如abcabca,可以发现这个字符串的循环周期为3,即abc,那么还需要添加多少个字符,使得整个字符串是n倍的循环,并且n大于1;

abcabca 循环周期为3,所以还需要添加2个字符;

abcabc  循环周期为3,所以还需要添加0个字符;

abc        循环周期为3,但是其大循环为1,所以最少还要增加个abc,即需要添加3个字符;

KEY:运用KMP算法中的next数组可完美解决此问题,已经知道abcabca一共有7个字符,而且next[1-7]中的数值为分别为0 0 0 1 2 3 4;显然循环周期为T=7-4;

也知道abcabcabca中next的值分别对应为0 0 0 1 2 3 4 5 6 7;  可以发现循环周期T=10-7;

由此:循环周期T=len-nex[len];

刚开始用cin读入了t,用cout进行了输出,居然超时了;

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 #define N 100005
 6 char str[N];
 7 int next[N];
 8 void get_next()
 9 {
10 
11     int i=0,j=-1;
12     next[0]=-1;
13     int len=strlen(str);
14     while(i<len)
15     {
16 
17         if(j==-1||str[i]==str[j])
18         {
19 
20             i++;
21             j++;
22             next[i]=j;
23         }
24         else
25             j=next[j];
26     }
27   //  for(i=0;i<=len;i++)
28   //   printf("%d ",next[i]);
29   //  printf("\n");
30 
31 }
32 int main()
33 {
34     int  t;
35     scanf("%d",&t);
36     getchar();
37     while(t--)
38     {
39 
40         scanf("%s",str);
41         memset(next,0,sizeof(next));
42         get_next();
43         int T;
44         int len=strlen(str);
45         T=len-next[len];
46         if(next[len]%T==0&&next[len]!=0)
47         {
48             printf("0\n");
49         }
50         else
51             printf("%d\n",T-next[len]%T);
52     }
53 
54     return 0;
55 
56 
57 
58 
59 }

 

 

你可能感兴趣的:(ext)