`

hdu 1358 Period ((KMP算法)求循环节的个数)

阅读更多

题目链接

 

题意是求前n个数的循环节的个数:

例如:aabaabaabaab中 ,

前2个字符aa,循环节为a, 所以为2 2;

前6 个 字符循环节为aab,  所以为6 2;

前9个 字符循环节为aab,   所以为9 3;

前12 个 字符循环节为aab,所以为12 4;

 

关键是如何求循环节,首先还要熟悉next数组的意思,next[j]=k,表示j前面k个元素与开头的前k个元素相同,但是中间可能有循环的元素,如何去除重复的元素

i 0 1 2 3 4 5 6 7 8 9 10 11 12
a[i] a a b a a b a a b a a b  
next[i] -1 0 1 0 1 2 3 4 5 6 7 8 9

 

 2*next[i]-i即可以求出中间重复的元素;

(原因:初中因该学过,给N个元素,前k个元素和后k个元素相等,求重复的元素个数)

next[i]-(2*next[i]-i) == i-next[i]即是最小的循环节;

i/最小循环节  =  循环的次数 ;

 

 

#include<cstdio>
#include<cstring>
using namespace std;

const int MAX = 1000000 + 5;
int next[MAX],len;
char a[MAX];

void get_next()
{
	int i=0,j=-1;
	next[0]=-1;
	while(i<len) 
	{
		while(j>-1&&a[j]!=a[i])
			j=next[j];
		j++;
		i++;
		next[i]=j;
	}
}

int main()
{
	int ncase=0;
	while(scanf("%d",&len)&&len)
	{
		scanf("%s",a);
		int circle; 
		get_next();
		printf("Test case #%d\n",++ncase);
		for(int i=1;i<=len;i++)
		{
			circle=next[i]-(2*next[i]-i);
			if(2*next[i]-i>=0 && i%circle == 0)
			{
				printf("%d %d\n",i,i/circle);
			}
		}
		printf("\n");
	}
	return 0;
}

 

分享到:
评论

相关推荐

    hdu ACM代码 每种算法都有分类

    HDU ACM代码集合是针对ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)的一份资源,这个压缩包中的代码涵盖了多种算法,是参赛者或对算法学习感兴趣的人宝贵的参考资料。ACM竞赛旨在...

    HDU算法讲解的PPT

    HDU算法讲解的PPT是一份非常有价值的教育资源,由知名教育机构HDU(杭州电子科技大学)的lcy老师精心制作并讲解。这份PPT涵盖了算法的各个方面,是学习和提升算法能力的理想材料。标签“算法”、“讲解”和“经典”...

    hdu动态规划算法集锦

    根据提供的信息,我们可以总结出以下关于“hdu动态规划算法集锦”的知识点: ### 动态规划基础概念 动态规划是一种解决多阶段决策问题的方法,它通过将原问题分解为互相重叠的子问题,利用子问题的解来构建原问题...

    HDU 算法 ACM课件

    HDU(杭州电子科技大学)的ACM算法课件是一份宝贵的学习资源,旨在提升程序员的算法思维和解题能力。ACM,全称国际大学生程序设计竞赛(International Collegiate Programming Contest),是全球范围内的一项权威性...

    samcat2021#ZXBlog#Hdu - 1711. Number Sequence以及KMP算法总结1

    next[i]的含义是在str[i]之前的字符串str[0...i]中,必须以str[i-1]结尾的后缀子串(不能包含str[0])与必须以str[0]开头的前

    ACM-HDU涉及了很多算法

    在ACM(国际大学生程序设计竞赛)中,HDU(杭州电子科技大学)的在线判题系统是许多参赛者磨炼算法技巧的重要平台。这个平台涵盖了众多的算法问题,旨在提升参赛者的编程能力和逻辑思维能力。以下是对标题和描述中...

    hdu.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...

    hdu1010搜索算法

    杭州电子科技大学oj平台上的第1010题,是关于搜索的题目,很不错的题

    zyq2652192993zyq#Advance-Algorithm#HDU-1711 Number Sequence(KMP算

    HDU-1711 Number Sequence(KMP算法)For each test case, you should output one line wh

    acm课件 HDU 算法大全

    acm 技术大牛 课件 HDU 自学必备课件 全套齐全 (lecture_01)初识ACM (lecture_02)简单数学题 (lecture_03)递推求解 (lecture_04)动态规划(1)_ (lecture_05)计算几何基础_ (lecture_06)母函数 (lecture_...

    KM匹配题集

    - **【HDU 3488】Tour 最小费用圈覆盖**、**【HDU 3435】A new Graph Game**、**【HDU 3722】Card Game**、**【HDU 3718】Similarity 求相似度**:这些题目虽然不是直接与KMP算法相关,但标签中的“最小费用圈覆盖”...

    杭电ACMhdu1163

    3. **字符串处理**:杭电ACM中的题目可能涉及到字符串匹配(KMP算法、Boyer-Moore算法)、编码解码、模式查找等问题,熟悉字符串操作是必备技能。 4. **数学应用**:很多ACM题目需要应用到基础数学知识,例如数论...

    ACM HDU

    6. **字符串处理**:模式匹配、KMP算法、Manacher's Algorithm等。 7. **模拟法**:直接按照题目描述进行程序模拟,解决一些逻辑性较强的问题。 学习和理解ACM HDU的题解,不仅可以提升编程能力,还能帮助我们理解...

    Hdu1000—2169部分代码

    6. **字符串处理**:KMP匹配、Z算法、后缀数组、AC自动机等。 通过分析和理解这些代码,你可以提升自己的算法思维,学习如何高效地解决问题,这对于参加ACM竞赛或者日常的编程工作都非常有益。同时,也可以借鉴代码...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    核心算法会涉及到循环和条件判断,用于检查每个三位数是否满足水仙花数的条件。此外,为了优化解决方案,参赛者可能会考虑对数字范围进行优化处理,避免不必要的计算,以提高程序效率。在ACM竞赛中,代码的运行时间...

    HDU最全ac代码

    HDU(Hangzhou Dianzi University)是国内外知名的在线编程竞赛平台,主要服务于ACM/ICPC(国际大学生程序设计竞赛)以及相关的算法训练。"HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码...

    ACM HDU题目分类

    贪心算法是一种常用的算法思想,在 ACM HDU 题目分类中,贪心算法也占据了一定的比例。例如,1009 贪心;1050 贪心;1052 贪心;1053 贪心,关于 Huffman 编码 等等。 数学题 数学题是 ACM HDU 题目分类中的一大类...

    Dijkstra算法解HDU1874

    **Dijkstra算法解HDU1874** Dijkstra算法是一种经典的图论算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出,主要用于解决单源最短路径问题。在这个问题中,我们需要从一个指定的起点(源节点)出发,找到...

    hdu 300+ AC 代码

    HDU 300+ AC 代码集合是一个包含超过300个已通过验证的算法解决方案的资源,这些代码主要用于解决各类计算机编程竞赛中的问题。这些竞赛通常由杭州电子科技大学(HDU)主办,旨在提升参赛者的算法设计、编程和问题...

    算法-数塔(HDU-2084).rar

    标题中的“算法-数塔(HDU-2084)”是指一个编程竞赛题目,源自杭州电子科技大学(HDU)的在线编程平台。在这个问题中,参赛者被要求解决一个名为“数塔”的算法挑战。数塔问题通常涉及到递归、深度优先搜索(DFS)...

Global site tag (gtag.js) - Google Analytics