HDU 1711 : Number Sequence

基础KMP题

#include<cstdio>
using namespace std;

const int maxn=10000+100;

int ch[maxn*100],ph[maxn];
int fail[maxn];
int n,m;

inline void getFail(){

    fail[0]=fail[1]=0;
    for(int i=1;i<m;i++){

        int j=fail[i];
        while(j && ph[i]!=ph[j]) j=fail[j];
        fail[i+1]= (ph[i]==ph[j]?j+1:0);
    }
}

inline int match(){

    int j=0;
    for(int i=0;i<n;i++){

        while(j && ch[i]!=ph[j]) j=fail[j];
        if(ch[i]==ph[j]) j++;
        if(j==m) return i-m+2;
    }
    return -1;
}

int main(){

    int T;
    scanf("%d",&T);
    while(T--){

        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++) scanf("%d",&ch[i]);
        for(int i=0;i<m;i++) scanf("%d",&ph[i]);
        getFail();
        printf("%d\n",match());
    }
} 

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/81174373