字符串-前缀中的周期(数据结构基础 第4周)

问题描述

分析
将KMP中next数组的值往前移动一位,规律就出来了。
比如

字符串 next数组
a 0
a 1
b 0
a 1
a 2
b 3
a 4
a 5
b 6
a 7
a 8
b 9

判断是否为周期的条件:i%(i-next[i-1])==0 && i/(i-next[i-1]) > 1; (i为第i个字符,i-1为其next数组下标)

参考:http://blog.csdn.net/u013487630/article/details/18989437
源码

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
using namespace std;

int main() {
    int n;
    int cases=0;
    string P;
    while(cin>>n && n!=0) {
        vector<int> next(n, 0);
        cin>>P;
        next[0]=0;
        int j=0;
        for(int i=1; i<n; i++) {
            int j=next[i-1];  //j表示当前匹配了多少位
            while(j && P[j]!=P[i]) 
                j=next[j-1];
            if (P[j]==P[i]) {
                next[i]=j+1;
            }
            else {
                next[i]=0;
            }
        }
        cout << "Test case #" << ++cases << endl;
        for(int i=2; i<=n; i++) {
            if (i%(i-next[i-1])==0 && i/(i-next[i-1]) > 1) {
                cout << i << " " << i/(i-next[i-1]) << endl;
            }
        }
        cout << endl;
    }
    return 0;
}

你可能感兴趣的:(字符串-前缀中的周期(数据结构基础 第4周))