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

【hdu1711】 Number Sequence

时间:2017-10-22 16:59:19      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:pac   number   return   inline   log   mem   ==   enc   mp算法   

虽然noip很少有单独把一些关于字符串的算法拉出来考,但是一定的练习也是必要的23333333333,至少要把板子打一遍吧2333333333333

这个题是一个裸到不能再裸的kmp,算是开始?233333

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int ne[10010],n,m,t,ans;
int a[1000010],b[10010];
inline void init()
{
    int j=0;//j是指当前在匹配串的第几位,预处理next数组实际上很像next数组自己进行匹配 
    for(int i=2;i<=m;i++)//i是指当前在被匹配串的第几位 
    {
        while(j&&b[i]!=b[j+1])//如果当前这一位 
            j=ne[j];//向前面的与这一段匹配的子串跳转而去 
        if(b[i]==b[j+1])//如果当前这一位匹配 
            j++;//j就标记在这里 
        ne[i]=j;//当前这位的next就记录为j 
    }
}
//kmp算法实际上是记录了之前的匹配信息,在这个基础上进行下一步匹配,感觉和记忆化搜索有点像233333 
inline void kmp()//和刚才预处理类似 
{
    int j=0;ans=0;//多加了个ans 
    for(int i=1;i<=n;i++)
    {
        while(j&&b[j+1]!=a[i])//这里a成了被匹配串 
            j=ne[j];
        if(a[i]==b[j+1])
            j++;
        if(j==m)//因为这个题说找到最小的一个k,所以在这里停下 
        {
            ans=i-j+1;return;
        }
    }
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        memset(ne,0,sizeof(ne));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=m;i++)
            scanf("%d",&b[i]);
        init();//预处理 
        kmp();
        if(ans>0)
            printf("%d\n",ans);
        else
            printf("-1\n");
    }
}

 

【hdu1711】 Number Sequence

标签:pac   number   return   inline   log   mem   ==   enc   mp算法   

原文地址:http://www.cnblogs.com/Loi-dfkdsmbd/p/7709850.html

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