码迷,mamicode.com
首页 > 其他好文 > 详细

Hdu1711 Number Sequence--Kmp模板题

时间:2020-02-02 17:26:24      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:break   print   turn   ret   def   ==   hdu2087   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\n",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\n",i-lenb+1);bo=0;break;}
    }
    if(bo) puts("-1");
}
    return 0;
}

如果希望找到多个位置,Hdu2087剪花布条

if(j==lenb)
{
ans++;
printf("%d\n",i-j+1)
j=0;
}

 

Hdu1711 Number Sequence--Kmp模板题

标签:break   print   turn   ret   def   ==   hdu2087   kmp   --   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!