<题目链接>
题目大意:
意思是给出两个串,找出匹配串在模式串中的位置。
解题分析:
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\n"):printf("%d\n",res - m + 1); 37 } 38 }
2018-04-17