1. 程式人生 > 實用技巧 >【JLOI2007】週期串 - KMP -字首函式

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