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

hdu 1711 Number Sequence

2010-05-22 00:10 393 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1711

#include<stdio.h>
int a[1000001],b[10001],hh[10001]={0};
int
n,m;
void
KMP()
{

int
i;
for
(i=1;i<m;i++)
if
(b[i] == b[ hh[i-1] ])
hh[i] = hh[i-1] + 1;
else

hh[i] = (b[i] == b[0]);
}

int
cmp()
{

int
i=0,j=0;
while
(i<n)
{

if
(j==0 || a[i]==b[j])
{

if
(a[i]==b[j]) j++;
i ++; }
else

j = hh[j-1];
if
(j==m) return i-j+1;
}

return
-1;
}

int
main()
{

int
T,i,j,K;
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]);
KMP();
printf("%d/n",cmp());
}
}


下面是数据结构正中的kmp ,

#include <iostream>

using namespace
std;
int
t[1000001];
int
p[10001];
int
next[10001];

void
solve(int n)
{

int
k = -1;
int
i=0;
next[0] = -1;
while
(i<n)
{

while
(k>=0 && p[i] != p[k])
k = next[k];
i++;
k++;
if
(p[i] == p[k])
next[i] = next[k];
else

next[i] = k;
}
}


int
main()
{

int
n;
while
(scanf("%d",&n)!=EOF)
{

while
(n--)
{

int
a,b;
scanf("%d%d",&a,&b);

for
(int i=0;i<a;i++)
scanf("%d",&t[i]);
for
(int i=0;i<b;i++)
scanf("%d",&p[i]);
solve(b);
int
k=0,j=0;
while
(k<b && j<a)
{

if
(k == -1 || p[k] == t[j])
k++,j++;
else

k = next[k];
}

if
(k>=b) cout<<j - b + 1<<endl;
else

cout<<"-1"<<endl;
}
}

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