POJ 1961 Period (KMP)

来源:互联网 发布:2016年海南旅游数据 编辑:程序博客网 时间:2024/06/05 11:05

题目链接:http://poj.org/problem?id=1961

构建KMP算法中的Next数组,发现最小循环节长度存在当且仅当i % (i - Next[i]) == 0

内存:
8332kB
时间:
177ms
语言:
G++

代码如下:

#include <iostream>#include <string>const int MAXN = 1000010;using std::cout;using std::cin;using std::endl;using std::string;int next[MAXN];int * buildNext(char * p){    int m = strlen(p);    int i, j;    int * next = new int [m];    i = next[0] = -1;    j = 0;    while(j < m - 1) {        if(0 > i || p[j] == p[i]){            ++j, ++i;            next[j] = (p[i] != p[j] ? i : next[i]);//改进的kmp,即真前缀和真后缀要在下一位上不同。        }        else i = next[i];    }    return next;}int main(){    std::ios::sync_with_stdio(false);    cin.tie(0);    int len, cases = 0;    string str;    while(cin >> len && len) {        cin >> str;        ++cases;        buildNext(str, len);        cout << "Test case #" << cases << endl;        for(int i = 1; i < len; ++i)        {            if(next[i] && !((i + 1) % (i + 1 - next[i])))                cout << i + 1 << " " << (i + 1) / (i + 1 - next[i]) << endl;        }        cout << "\n";    }    return 0;}