KMP--路过

HDU 1358:弄清楚了NEXT,就好解决,还有不要再循环中用strlen;会超

----------------------我是凑字数的------------------还是不会KMP------------------------------- 

HDU: 1711,模板题把,可惜还是不是很理解。

        再来一发matrix67的KMP算法解释:召唤门:http://www.matrix67.com/blog/archives/115 

        一个模板:#include<stdio.h>

#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define N 1000005
int next[N],a[N],b[N];
int n,m;

void kmp()
{
    next[0]=-1;
    int k=-1;
    int i=0;
    while (i<m)
    {
        if (k==-1||b[k]==b[i])
        {
            i++,k++;
            next[i]=k;
           // printf("%d ",k);
        }
        else k=next[k];
    }
    for (int i=0;i<=m;i++) printf("%d ",next[i]);
}

int getkmp()
{
    int k=0,i=0;
    if (n<m) return -1;
    while (i<n&&k<m)
    {
        if (k==-1||a[i]==b[k])
        {
            k++,i++;
            if (k==m) return i-m+1;
        }
        else k=next[k];
    }
    return -1;
}

int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d%d",&n,&m);
        for (int i=0;i<n;i++) scanf("%d",&a[i]);
        for (int i=0;i<m;i++) scanf("%d",&b[i]);
        memset(next,0,sizeof(next));
        kmp();
      //  for (int i=0;i<=m;i++) printf("%d ",next[i]);
       
// printf("%d\n",getkmp());
    }
    return 0;

} 

这题的HASH做法很神奇:挑战程序设计那本书真的很棒,^^///,滚动哈希真的不会有冲突吗? 

 

posted on 2014-05-21 15:22  forgot93  阅读(129)  评论(0编辑  收藏  举报

导航