HDU1711 Number Sequence KMP
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - HDU1711
题意概括
给T组数据,每组有长度为n和m的母串和模式串。判断模式串是否是母串的子串,如果是输出最先匹配完成的位置,否则输出-1.
题解
KMP裸题。
代码
#include <cstring> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> using namespace std; const int N=1000005,M=10005; bool isd(char ch){ return '0'<=ch&&ch<='9'; } void read(int &x){ int f=1; x=0; char ch=getchar(); while (!isd(ch)&&ch!='-') ch=getchar(); if (ch=='-') f=-1,ch=getchar(); while (isd(ch)) x=x*10+ch-48,ch=getchar(); x*=f; } int T,n,m,a[N],b[M],Next[M]; int main(){ read(T); while (T--){ read(n),read(m); for (int i=0;i<n;i++) read(a[i]); for (int i=0;i<m;i++) read(b[i]); memset(Next,0,sizeof Next); int k=0; for (int i=1;i<m;i++){ while (k&&b[k]!=b[i]) k=Next[k-1]; if (b[k]==b[i]) k++; Next[i]=k; } int ans=-1; k=0; for (int i=0;i<n;i++){ while (k&&b[k]!=a[i]) k=Next[k-1]; if (b[k]==a[i]) k++; if (k==m){ ans=i-m+2; break; } } printf("%d\n",ans); } return 0; }