首页 > 其他 > 详细

基础KMP两道

时间:2014-02-20 00:50:10      阅读:288      评论:0      收藏:0      [点我收藏+]

1. HDU 1711 Number Sequence  

代码:

bubuko.com,布布扣
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 10007

int a[1000007],b[N],next[N];
int n,m;

void getnext()
{
    next[0] = -1;
    int i = 0,j = -1;
    while(i<m)
    {
        if(j == -1 || b[i] == b[j])
        {
            ++i,++j;
            if(b[i] != b[j])
                next[i] = j;
            else
                next[i] = next[j];
        }
        else
            j = next[j];
    }
}

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

int main()
{
    int t,i,res;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(i=0;i<m;i++)
            scanf("%d",&b[i]);
        if(n<m)
        {
            printf("-1\n");
            continue;
        }
        getnext();
        res = kmp();
        if(res)
            printf("%d\n",res);
        else
            printf("-1\n");
    }
    return 0;
}
View Code

代码2:

bubuko.com,布布扣
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 10007

int a[1000007],b[N],next[N];
int n,m;

void getnext()
{
    next[0] = -1;
    int i = 0,j = -1;
    while(i<m-1)
    {
        if(j == -1 || b[i] == b[j])
            next[++i] = ++j;
        else
            j = next[j];
    }
}

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

int main()
{
    int t,i,res;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(i=0;i<m;i++)
            scanf("%d",&b[i]);
        if(n<m)
        {
            printf("-1\n");
            continue;
        }
        getnext();
        res = kmp();
        if(res)
            printf("%d\n",res);
        else
            printf("-1\n");
    }
    return 0;
}
View Code

 

2.POJ 3461 Oulipo

代码:

bubuko.com,布布扣
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 10007

char a[1000004],b[N];
int next[N];
int n,m,cnt;

void getnext()
{
    next[0] = -1;
    int i = 0,j = -1;
    while(i<m)
    {
        if(j == -1 || b[i] == b[j])
            next[++i] = ++j;
        else
            j = next[j];
    }
}

void kmp()
{
    int i = -1,j = -1;
    while(i<n && j<m)
    {
        if(j == -1 || a[i] == b[j])
            i++,j++;
        else
            j = next[j];
        if(j == m)
        {
            cnt++;
            j = next[j];
        }
    }
}

int main()
{
    int t,i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",b);
        scanf("%s",a);
        n = strlen(a);
        m = strlen(b);
        getnext();
        cnt = 0;
        kmp();
        printf("%d\n",cnt);
    }
    return 0;
}
View Code

基础KMP两道

原文:http://www.cnblogs.com/whatbeg/p/3555930.html

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