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;
}

原文地址:https://www.cnblogs.com/cutemush/p/12252826.html