【JLOI2007】週期串 - KMP -字首函式
阿新 • • 發佈:2021-01-09
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; }