您的位置:首页 > 产品设计 > UI/UE

HDU 1711 (裸KMP) Number Sequence

2014-11-20 02:20 405 查看
题意:

用第二个数列去匹配第一个数列,输出第一次匹配到的位置,如果没有则输出-1.

分析:

这明显是一道裸的KMP。

我是在这篇博客上学的KMP算法的,讲得比较透彻。
http://blog.csdn.net/v_july_v/article/details/7041827
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn1 = 1000000 + 10;
const int maxn2 = 10000 + 10;
int a[maxn1], b[maxn2], next[maxn2];
int n, m;

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

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

int main()
{
//freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
while(T--)
{
memset(next, 0, sizeof(next));

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]);
get_next();
printf("%d\n", KMP()+1);
}

return 0;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: