HDU 1711KMP

xiaoxiao2025-07-25  34

kmp模板,不理解就自己百度学习吧。

s  t数组中第一位存储的都是其长度 ,注意i,j初始化的值

//kmp模板题 //使用优化过后的kmp #include <bits/stdc++.h> using namespace std; #define ll long long #define INF 0x3f3f3f const int maxn=10000+10; int s[1000010],t[maxn]; int* get_gnext() { int i,j; int* next=(int*)malloc(maxn*sizeof(int)); next[1]=0,i=1,j=0; while(i<=t[0]){ if(0==j || t[i]==t[j]){ i++,j++; if(t[i]!=t[j]) next[i]=j; else next[i]=next[j]; }else j=next[j]; } return next; } int kmp() { int *next=get_gnext(); int i=1,j=1; while(i<=s[0]&&j<=t[0]){ if(0==j || s[i]==t[j]) i++,j++; else j=next[j]; } if(j>t[0]) return i-t[0]; else return -1; } int main() { int T; cin >> T; while(T--){ int n,m,i,j; cin >> n >> m; s[0]=n,t[0]=m; for(i=1;i<=s[0];i++) scanf("%d",&s[i]); for(i=1;i<=t[0];i++) scanf("%d",&t[i]); cout << kmp() << endl; } return 0; }

 

转载请注明原文地址: https://www.6miu.com/read-5033687.html

最新回复(0)