POJ-1961(KMP)

来源:互联网 发布:linux目录命令 编辑:程序博客网 时间:2024/05/16 03:17

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

与poj2406几乎一样的题目,只是换了个问法:先求出next[]数组,当j-next[j]是j的因子是说明前j个字符可由前j-next[j]个字符扩展而来


#include <cstdio>#define MAX_LEN 1000000void getNext(int next[], const char* p){    next[0] = -1;    int i = 0, j = -1;    while(p[i]){        if(j == -1 || p[i] == p[j]){            ++i;            ++j;            next[i] = j;        }        else j = next[j];    }}int next[MAX_LEN + 2], len;char p[MAX_LEN + 1];void solve(){    getNext(next, p);    for(int i = 2; i <= len; ++i){        int t = next[i];        if(t && i % (i - t) == 0) printf("%d %d\n", i, i / (i - t));    }}int main(){    int test = 0;    while(scanf("%d", &len), len){        while(getchar() != '\n') ;        gets(p);        printf("Test case #%d\n", ++test);        solve();        puts("");    }    return 0;}


0 0
原创粉丝点击