【KMP】模板

来源:互联网 发布:淘宝卖京东e卡 骗局 编辑:程序博客网 时间:2024/06/02 03:25
#include<iostream>using namespace std;#define MAXN 1000000#define MAXM 100000int T[MAXN],P[MAXM],Next[MAXM];void MakeNext(int M)//找到一个匹配位置{    Next[0] = -1;    int i = 0, j = -1;    while(i<M){        if(j==-1 || P[i]==P[j]){            i++,j++;            if(P[i]!=P[j])Next[i] = j;            elseNext[i] = Next[j];        }        elsej = Next[j];    }}int KMP(int N,int M)//进行匹配{    int i=0,j=0;    while(i<N && j<M){        if(T[i]==P[j] || j==-1)i++,j++;        elsej = Next[j];    }    if(j==M)return i-M+1;    elsereturn -1;}int main(){    int N,M,C;    scanf("%d",&C);    while(C--){int i;        scanf("%d %d",&N,&M);        for(i=0;i<N;i++)scanf("%d",&T[i]);        for(i=0;i<M;i++)scanf("%d",&P[i]);        if(M>N)printf("-1\n");        else{            MakeNext(M);            printf("%d\n",KMP(N,M));        }    }    return 0;}

0 0
原创粉丝点击