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

来源:互联网 发布:如何还房贷最划算知乎 编辑:程序博客网 时间:2024/04/27 21:15

问题描述
这里写图片描述
分析
将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;}
0 0
原创粉丝点击