[裸KMP][HDU1711][Number Sequence]

来源:互联网 发布:java actionevent 编辑:程序博客网 时间:2024/05/18 03:55

题意

找到子串在母串出现的第一个位置

解法

裸的KMP

特别的地方

第一次不看模板自己敲的KMP

#include<stdio.h>const int maxn=100000;const int MAXN=1000000;int next[maxn];int S[MAXN];int T[maxn];int N,M;void get_next(){    for(int i=2;i<=M;i++)    {        int p=i-1;        while(T[next[p]+1]!=T[i]&&p!=0) p=next[p];        if(p!=0)        next[i]=next[p]+1;        else next[i]=0;    }}void input(){    scanf("%d%d",&N,&M);    for(int i=1;i<=N;i++)        scanf("%d",&S[i]);    for(int i=1;i<=M;i++)        scanf("%d",&T[i]);}int kmp(){    int i=1,j=0;    for(i=1;i<=N;i++)    {        while(S[i]!=T[j+1]&&j>0) j=next[j];        if(S[i]==T[j+1]) j++;        if(j==M) return i-M+1;    }    return 0;}void solve(){    get_next();   int t=kmp();    if(t==0) printf("-1\n");    else printf("%d\n",t);}int main(){    //freopen("a.in","r",stdin);    int T;    scanf("%d",&T);    while(T--)    {        input();        solve();    }}

//等会继续写

0 0
原创粉丝点击