【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;
}