Hdu1711 Number Sequence--Kmp模板题
Posted cutemush
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hdu1711 Number Sequence--Kmp模板题相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h> using namespace std; void read(int &x){ x=0;int f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)f=-f; for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-‘0‘;x*=f; } #define write(x) printf("%d ",x) #define maxn 1005000 int p[1005001],n,m,k,a[1005001],b[1005001],lena,lenb,j; int main() { read(k); while(k--) { p[1]=0; read(lena),read(lenb); j=0; for(int i=1;i<=lena;i++) read(a[i]); for(int i=1;i<=lenb;i++) read(b[i]); for(int i=2;i<=lenb;i++) { while(j>0&&b[j+1]!=b[i]) j=p[j]; if(b[j+1]==b[i])j++; p[i]=j; } j=0; bool bo=1; for(int i=1;i<=lena;i++) { while(j>0&&b[j+1]!=a[i]) //如果匹配串第J个位置还可以滑动,且第j+1个位置与母串的第i个位置不匹配的话 j=p[j]; //滑动 if(b[j+1]==a[i]) j++; if(j==lenb){printf("%d ",i-lenb+1);bo=0;break;} } if(bo) puts("-1"); } return 0; }
如果希望找到多个位置,Hdu2087剪花布条
if(j==lenb)
{
ans++;
printf("%d
",i-j+1)
j=0;
}
以上是关于Hdu1711 Number Sequence--Kmp模板题的主要内容,如果未能解决你的问题,请参考以下文章