HDU 1711Number Sequence【KMP模板题】

<题目链接>

题目大意:

意思是给出两个串,找出匹配串在模式串中的位置。

解题分析:

KMP算法模板题。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 const int N = 1e6+10;
 7 int n,m;
 8 int s1[N],s2[N];
 9 int nxt[N];
10 void get_nxt(){
11     int j=0,k=-1;
12     nxt[0]=-1;
13     while(j < m){
14         if( k==-1 || s2[j] == s2[k]){
15             nxt[++j]=++k;
16         }else k=nxt[k];
17     }
18 }
19 int KMP(){
20     int i=0,j=0;
21     while(i<n){
22         if(j==-1||s1[i] == s2[j]){
23             ++i,++j;
24         }else j=nxt[j];
25         if(j == m)return i;
26     }
27     return -1;
28 }
29 int main(){
30     int T;scanf("%d",&T);while(T--){
31         scanf("%d %d",&n,&m);
32         for(int i=0;i<n;i++)scanf("%d",&s1[i]);
33         for(int i=0;i<m;i++)scanf("%d",&s2[i]);
34         get_nxt();
35         int res=KMP();
36         res==-1?printf("-1
"):printf("%d
",res - m + 1);
37     }
38 }

2018-04-17

原文地址:https://www.cnblogs.com/00isok/p/8870872.html