hdu3746Cyclic Nacklace

2024-05-05 05:48
文章标签 nacklace hdu3746cyclic

本文主要是介绍hdu3746Cyclic Nacklace,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意:

       给你一串字符(a~b),问你最少需要在末尾添加多少个字符,使得这串字符形成一个循环,如abcab需要在末尾添加一个c即可.

解题思路:

其实就是next数组的应用。

        当next[n]*2>=n的时候,必然出现了循环节,我们只要就出最小的循环节,pre=(n-(next[n]))然后,如果n%pre==0,的话就是说刚好形成的n/pre个循环,就不必再添加了,但是如果n%pre!=0,那么n-(n%pre)就是还需要添加的。

        当next[n]*2<n就是说一个循环都还没形成,那么n-next[n]就是需要添加的字符数。

#include<stdio.h>
#include<string.h>
#define N 100009
int next[N];
int get_next(int n,char *p){int i=0,j=-1;next[i]=j;while(i<n){if(j==-1||p[i]==p[j]){i++;j++;next[i]=j;}else{j=next[j];}}return next[n];
}
void getans(int len,int k){if(2*k<len){printf("%d\n",len-2*k);return ;}else{int pre=len-k;if(len%pre==0){printf("0\n");return ;}else{printf("%d\n",pre-(k%pre));return ;}}return ;
}
int main()
{char buff[N];int t,len,j;scanf("%d",&t);getchar();while(t--){gets(buff);len=strlen(buff);j=get_next(len,buff);getans(len,j);}return 0;}






     



         

这篇关于hdu3746Cyclic Nacklace的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960917

相关文章

HDU 3746 Cyclic Nacklace(KMP,最短循环节)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=3746 题目大意: 给定一个字符串T, 在T后面添加x个字符串(让x最小),使得新字符串由前缀字串至少循环两次构成的。 例如, abca,  只需要再添加2个字母bc, 形成abcabc,就变成了由abc循环两次构成的。 分析与总结: 失配函数构造next数组的性质的应用,需要

KMP算法及应用(hdu2087剪花布条 )Power Strings (POJ2046)Cyclic Nacklace(HDU3746)

KMP由Knuth(D.E.Knuth)、Morris(J.H.Morris)和Pratt(V.R.Pratt)三人设计的线性时间字符串匹配算法。所以叫做KMP。。。。。 字符串匹配,就是从一个字符串中查找出另一个字符串所在位置,当然也可能出现查询不到的情况。 比如给出目标字符串 ss: abcabcabce 所要匹配的模式串 s: abcabce 当匹配到前6位是,都是成功的,但

hdu 3746 Cyclic Nacklace(KMP 最短循环节)

1、http://acm.hdu.edu.cn/showproblem.php?pid=3746 2、题目大意: 给定一个字符串T, 在T后面添加x个字符串(让x最小),使得新字符串由前缀字串至少循环两次构成的。 例如, abca,  只需要再添加2个字母bc, 形成abcabc,就变成了由abc循环两次构成的。 对于长度为len的字符串,假设已经够造完了next数组,那么len