首页 > 其他 > 详细

【hdu1711】 Number Sequence

时间:2017-10-22 15:36:18      阅读:245      评论:0      收藏:0      [点我收藏+]

虽然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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!