POJ-2406(KMP)

来源:互联网 发布:遗传算法入门经典实例 编辑:程序博客网 时间:2024/05/21 09:28

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

next[j] = k表示p[0,k-1] = p[j-k,j-1],即前k个字符与j-k~j-1这k个字符时完全一样的,注意到两段重合的部分为j-k~k-1,长度为(k-1) - (j-k) + 1 = 2k-j,前者还包含p[0,j-k-1]个字符,后者还包含p[k,j-1]个字符,长度为j-k,当j是j-k的整数倍时,即j = m * (j-k)时,有p[0,j-1] = p[0,j-k-1] ^ m,实际上画个图我们就能直观地看到这一结果了


#include <stdio.h>#include <string.h>#define MAX_LEN 1000000char p[MAX_LEN + 1];int next[MAX_LEN + 1];void getNext(){    int i = 0, j = -1;    next[0] = -1;    while(p[i]){        if(j == -1 || p[i] == p[j]){            ++i;            ++j;            next[i] = j;        }        else j = next[j];    }}int solve(){    int len = strlen(p), t;    getNext();    t = next[len];    if(t && len % (len - t) == 0) return len / (len - t);    else return 1;}int input(){    gets(p);    return strcmp(p, ".");}int main(){    while(input()) printf("%d\n", solve());    return 0;}


0 0
原创粉丝点击