hdoj 1711 Number Sequence

来源:互联网 发布:消防工程师题库软件 编辑:程序博客网 时间:2024/06/05 15:16

题目链接:Number Sequence

题目大意:给你一个原串和一个模式串,问是否在原串中找到模式串,能输出第一个匹配的首位置,否则输出-1

题目思路:直接KMP找就好,找到了直接输出位置不用继续KMP,没找到输出-1

#include <bits/stdc++.h>using namespace std;const int maxn = 1e6+10;int Next[maxn];int mo[maxn],str[maxn],n,m;void getNext(){    int i = 0,j = -1,len = m;    while(i < len){        if(j == -1||mo[i] == mo[j]) Next[++i] = ++j;        else j = Next[j];    }}int kmp(){    int i = 0,j = 0;    int l1 = n,l2 = m;    while(i < l1){        if(j == -1||mo[j] == str[i]){            i++;j++;        }        else j = Next[j];        if(j == l2){            return i-m+1;        }    }    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",&str[i]);        for(int i = 0;i < m;i++)            scanf("%d",&mo[i]);        Next[0] = -1;        getNext();        printf("%d\n",kmp());    }    return 0;}
原创粉丝点击