HDU1711 Number Sequence KMP
Posted tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于HDU1711 Number Sequence KMP的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 1711 A - Number Sequence(kmp