pku 3461 Oulipo (裸kmp匹配)

来源:互联网 发布:淘宝航空箱定做 编辑:程序博客网 时间:2024/05/22 16:41

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


题意:求W在Z出现的次数。


主串   W    A   Z   A   /0

                 -1   0   0    1

模式串T    A  Z  A  Z  A  Z  A


next可以让其主串中的正确位置与T下一个字符匹配。

#include<stdio.h>#include<string.h>const int maxn=1000005;char T[maxn],W[10005];int next[10005];void get_next(int len){    int i=0,j=-1;    next[0]=-1;    while(i<len){        if(j==-1||W[i]==W[j]){            i++;            j++;            next[i]=j;        }        else            j=next[j];    }}int main(){    int n,i,j;    scanf("%d",&n);    while(n--){        scanf("%s",W);        scanf("%s",T);        int ans=0;        int len1=strlen(W),len2=strlen(T);        get_next(len1);        i=0;        j=0;        while(i<len2){            if(j==-1||T[i]==W[j])     /*还是如此,只有这里才能i++,即让i往后移。移完之后如果还不匹配,再赋为-1,让其得以往后移。但每回匹配时,j已经变回0了*/                i++,j++;            else                j=next[j];            if(j==len1)                ans++,j=next[j];      /*完全匹配成功和匹配失败都要改变下标j,使W中正确的位置与T匹配*/        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击