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

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;
}
posted @ 2021-01-09 15:24  wuwendongxi  阅读(148)  评论(0编辑  收藏  举报