Period
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5098 Accepted Submission(s): 2467
這個因爲不是匹配字符串,所以不需要當x[i] == x[i + 1]時令兩者next的值相等。而這個題又是求重複的循環子串的個數的問題,根據之前做的求循環子串補齊大小的題目類似。我們只需要確認只要當前位置與當前位置的next數組的值的差是當前位置的一個因子即可,且必須要求這個因子不能是當前位置本身。這個很好證明,當前位置與當前位置的next數組的值的差是循環子串的長度,只要這個長度是一個因子,當然是滿足是循環的。
代碼如下:
/*************************************************************************
> File Name: Period.cpp
> Author: Zhanghaoran
> Mail: [email protected]
> Created Time: Tue 24 Nov 2015 09:01:57 PM CST
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
void preKMP(char x[], int m, int nextKMP[]){
int i , j;
j = nextKMP[0] = -1;
i = 0;
while(i <= m){
if(j == -1 || x[i] == x[j]){
nextKMP[++ i] = ++ j;
if(i % (i - j) == 0 && i / (i - j) > 1){
cout << i << " " << i / (i - j) << endl;
}
}
else
j = nextKMP[j];
}
cout << endl;
}
int nexti[1000010];
void KMP_Count(char x[], int m){
int i, j;
int ans = 0;
preKMP(x, m, nexti);
}
int N;
char a[1000010];
int main(void){
int cas = 1;
while(1){
scanf("%d", &N);
if(N == 0)
break;
printf("Test case #%d\n",cas ++);
scanf("%s", a);
KMP_Count(a, N);
}
}