觉得浮夸了四年,漠然发现原来是浮躁了四年!

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 }
复制代码

 

 

posted @   heat nan  阅读(355)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示