HDU 3746 Cyclic Nacklace(KMP找循环节)

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

题目大意:给你一个字符串,求出将字符串的最少出现两次循环节需要添加的字符数。

解题思路:

这题需要利用next数组的性质,求出字符串的最小循环节

有几个结论(具体可以看这里http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html):

①字符串长度为len,则len-next[len]为最小循环节。

②如果len%(len-next[len])==0,此字符串的最小周期就为len/(len-next[len])。

借用以上结论,我们可以直接判断字符串是否已满足条件,或者需要补齐的字符数。

复制代码
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=1e6+5;
 7 
 8 int len;
 9 int nxt[N];
10 char p[N];
11 
12 void getnext(){
13     int i,j;
14     i=0,j=nxt[0]=-1;
15     while(i<len){
16         while(j!=-1&&p[i]!=p[j])
17             j=nxt[j];
18         nxt[++i]=++j;
19     }
20 }
21 
22 int main(){
23     int t;
24     scanf("%d",&t);
25     while(t--){
26         scanf("%s",p);
27         len=strlen(p);
28         getnext();
29         int mmin=len-nxt[len];              //len-nxt[len]为字符串的最小循环节
30         if(len!=mmin&&len%mmin==0)          //含有两个以上循环节
31             puts("0");
32         else
33             printf("%d\n",mmin-len%mmin);   //len%mmin等同于"abcab"减掉"abc"
34     }
35     return 0;
36 }
复制代码

 

posted @   Yeader  阅读(224)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
阅读排行:
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 告别虚拟机!WSL2安装配置教程!!!
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多
点击右上角即可分享
微信分享提示