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

HDU 1711 Number Sequence

2015-02-20 19:48 239 查看
题意:给出两个数组,寻找k使得a[k] == b[1] …a[k+n] == b
,问最小的k是多少;

做法:KMP呗。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int c1[1111111],c2[111111];
int next[111111],lenc1,lenc2;
void getnext()
{
int i = 0 , j = -1;
next[0] = -1;
while(i != lenc2)
{
if(j == -1 || c2[i] == c2[j]) next[++i] = ++j;
else j = next[j];
}
}
int KMP()
{
int i = 0, j = 0;
while(i != lenc1 && j != lenc2)
{
if(c1[i] == c2[j] || j == -1)
i++,j++;
else j = next[j];
if (j == lenc2)
{
return i;
}
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&lenc1,&lenc2);
for(int i = 0 ; i < lenc1 ; i++)
scanf("%d",&c1[i]);
for(int i = 0 ; i < lenc2 ; i++)
scanf("%d",&c2[i]);
getnext();
int ans = KMP();
if(ans == -1) printf("-1\n");
else
printf("%d\n",ans - lenc2 + 1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm kmp