ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【JLOI2007】周期串 - KMP -前缀函数

2021-01-09 15:34:54  阅读:176  来源: 互联网

标签:JLOI2007 周期 int 函数 KMP 字符串 include 前缀


Description

  如果一个字符串是以一个或者一个以上的长度为k的重复字符串所连接成的,那么这个字符串就被称为周期为k的字符串。
  例如:
  字符串’abcabcabcabc’周期为3,因为它是由4个循环’abc’组成的。它同样是以6为周期(两个重复的’abcabc’)和以12为周期(一个循环’abcabcabcabc’)。
  问 题:写一个程序,读入一个字符串,并测定它的最小周期。

Input

  一个最长为100的没有空格的字符串。

Output

  一个整数表示输入的字符串的最小周期。

Sample Input

HoHoHo

Sample Output

2


思路

  • kmp算法&前缀函数

让我们计算 s 的前缀函数。通过使用该函数的最后一个值,我们定义值。我们将证明,如果 k 整除 n ,那么 k 就是答案,否则不存在一个有效的压缩,故答案为 n 。


代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int nxt[105];
void getnext(char a[],int len)
{
	int i=0,j=-1; nxt[0]=-1;
	while(i<len)
	{
		if(j==-1||a[i]==a[j]) ++i,++j,nxt[i]=j;
		else j=nxt[j];
	}
}
int main()
{
	char a[105]; scanf("%s",&a);
	int len=strlen(a);
	getnext(a,len);
	int k=len-nxt[len];
	if(len%k) cout<<len<<'\n';
	else cout<<k<<'\n';
	return 0;
}

标签:JLOI2007,周期,int,函数,KMP,字符串,include,前缀
来源: https://www.cnblogs.com/wuwendongxi/p/14255090.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有