HDU1711-KMP算法

来源:互联网 发布:兰亭序真迹在哪里 知乎 编辑:程序博客网 时间:2024/06/06 03:34

题目链接HDU1711

这是一道KMP题,没什么好说的,直接模拟的话时间会爆(复杂度为O(n*m)),而KMP为O(n+m)。至于KMP的解释,可以拿数据结构书翻翻讲得非常清楚(严蔚敏版第四章串的模式匹配算法)
我第一遍提交的时候时间也爆了,因为我用的是cin/cout,改成scanf/printf就好了,因为才开始刷ACM的题,之前只是听说过cin/cout会花很长世间,但没有具体概念,可以去查查,尽量少用它吧

#include<iostream>using namespace std;void get_next(int *t,int *next){    int i=1,j=0;    next[1]=0;    while(i<=t[0]){        if(t[i]==t[j]||j==0){            i++;            j++;            if(t[i]!=t[j])            next[i]=j;            else            next[i]=next[j];        }        else        j=next[j];    }}int index_kmp(int *s,int *t,int *next){    int i=1,j=1;    while(i<=s[0]&&j<=t[0]){        if(s[i]==t[j]||j==0){            i++;            j++;        }        else        j=next[j];    }    if(j>t[0])    return i-t[0];    else    return -1;}int main(){    int i,j,k,n,m;    scanf("%d",&k);    for(i=0;i<k;i++){        scanf("%d %d",&n,&m);        int s[n+1],t[m+1],next[m+16],num;        s[0]=n,t[0]=m;        for(j=1;j<n+1;j++){            scanf("%d",&s[j]);        }        for(j=1;j<m+1;j++){            scanf("%d",&t[j]);        }        get_next(t,next);        num=index_kmp(s,t,next);        printf("%d\n",num);    }}
0 0