模式串匹配,KMP算法——HDU1711

题目链接

模式串匹配模板题

题目代码

#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=1e6+7;
const int maxm=1e4+7;
int a[maxn],b[maxm],n,m,nxt[maxm],t;
void GetNext(){
    int j=0,k=-1;
    nxt[0]=-1;
    while(j<m){
        if(k==-1||b[j]==b[k]){
            j++;k++;
            nxt[j]=k;
        }
        else k=nxt[k];
    }
}
int KmpSearch(){
    int i=0,j=0;
    int root=0;
    while(i<n&&j<m){
        if(j==-1||a[i]==b[j]){
            i++,j++;
        }
        else j=nxt[j];
    }
    if(j==m)return i-j+1;
    else return -1;
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<m;i++)
            scanf("%d",&b[i]);
        GetNext();
        printf("%d
",KmpSearch());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/helman/p/11303671.html