POJ1961->KMP

来源:互联网 发布:博源基金会 知乎 编辑:程序博客网 时间:2024/05/21 11:22

POJ1961->KMP


题目大意:

给你一个字符串,求他之前大于1的循环节.
比如aabaabaabaab,长度为12.到第二个a时,a出现2次,输出2.到第二个b时,aab出现了2次,输出2.到第三个b时,aab出现3次,输出3.到第四个b时,aab出现4次,输出4

题解:

next数组的运用
KMP的前缀函数处理出来的前缀数组表示当当前字符失配后,要向前调到哪一个位置可以继续匹配。也就是代表着跳到的那个位置之前的所有字符与当前失配字母前的相同数量个字母是相匹配的。

代码:

#include <stdio.h>#include <iostream>#include <string.h>using namespace std ;#define MAX 1000005int next[MAX] ;char word[MAX] ;void kmp_pre(char x[] , int m ,int next[]){    int i , j ;    j = next[0] = -1 ;    i = 0 ;    while(i < m)    {        if(j == -1 || x[i] == x[j]) next[++i] = ++j ;        else j = next[j] ;    }}int main(){    int length , l , cas = 1;    while(scanf("%d" , &l) , l)    {        scanf("%s" , word) ;        kmp_pre(word , l , next) ;        printf("Test case #%d\n", cas++);        for(int i = 1 ; i <= l ; i ++)        {            length = i - next[i] ;            if(i != length && i % length == 0)                printf("%d %d\n",i , i/length);        }        printf("\n");    }    return 0 ;}
0 0
原创粉丝点击