hdoj3746(kmp算法的nex数组求最小循环节)
Posted frankchen831x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdoj3746(kmp算法的nex数组求最小循环节)相关的知识,希望对你有一定的参考价值。
题目链接:https://vjudge.net/problem/HDU-3746
题意:给定一个字符串,问最少在两端添加多少元素使得整个字符串是呈周期性的。
思路:
应用到kmp中nex数组的性质,数组的最小循环节是L=len-nex[len],证明见http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html。
如果len%L==0,那么输出0.
否则输出L-len%L。
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1e5+5; int T,len,nex[maxn]; char s[maxn]; void get_next(){ int j; j=nex[0]=-1; for(int i=1;i<len;++i){ while(j>-1&&s[i]!=s[j+1]) j=nex[j]; if(s[i]==s[j+1]) ++j; nex[i]=j; } } int main(){ scanf("%d",&T); while(T--){ scanf("%s",s); len=strlen(s); get_next(); int t1=len-1,t2=nex[t1]; if(t2==-1){ printf("%d ",len); } else{ int t3=len-(t2+1); if(len%t3==0){ printf("0 "); } else{ printf("%d ",t3-len%t3); } } } return 0; }
以上是关于hdoj3746(kmp算法的nex数组求最小循环节)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 3746 - Cyclic Nacklace - [KMP求最小循环节]