kmp

fx397993401 2010-07-26 07:43:55
今天碰见一个赤裸裸的 kmp 算法的题 直接找了个模板 但是却一直WA
后来 查自己的数据结构的书 改动一下
//if( pat[j] > 0) return -2;
//else return i-j;
return ((j==b)?(i-b) :-2);
后来就过了 郁闷 确实对于kmp 算法不是很熟啊
很是杯具

# include<stdio.h>
# include<string.h>
int fail[10000+1];
long a,b;
int kmp(int* str, int* pat){
int i, j, k;
memset(fail, -1, sizeof(fail));
//fail[0] = 0;
for (i = 1; i<b; ++i) {
for (k=fail[i-1]; k>=0 && pat[i]!=pat[k+1];k=fail[k]);
if (pat[k + 1] == pat[i]) fail[i] = k + 1;
//if(k == 0) fail[i] = k + 1;
}
i = j = 0;
while( i< a && j < b ){ // By Fandywang
if( pat[j] == str[i] ) ++i, ++j;
else if(j == 0)++i;//第一个字符匹配失败,从str下个字符开始
else j = fail[j-1]+1; }
//if( pat[j] > 0) return -2;
//else return i-j;
return ((j==b)?(i-b) :-2);
}
int src[1000000+1];
int dest[10000+1];
int main()
{
int T,i;

//freopen("1284.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%ld%ld\n",&a,&b);
for(i = 0; i < a; i ++)
scanf("%d",&src[i]);
// src[i] = '\0';
for(i = 0; i < b; i ++)
scanf("%d",&dest[i]);
// dest[i] = '\0';
printf("%d\n",kmp(src,dest)+1);


}
return 0;
}
...全文
76 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cliffbaby 2010-07-30
kmp 是不是 做个 next 数组 更方便?
回复
fx397993401 2010-07-30
[Quote=引用 3 楼 cliffbaby 的回复:]

kmp 是不是 做个 next 数组 更方便?
[/Quote]

failure 数组 就是next
回复
fx397993401 2010-07-30
[Quote=引用 2 楼 oraclewu 的回复:]

建议翻下严蔚敏的《数据结构》,上面讲的很详细,记得似乎还有针对KMP的改进
[/Quote]

你能说下 么 要是知道的话
回复
oraclewu 2010-07-27
建议翻下严蔚敏的《数据结构》,上面讲的很详细,记得似乎还有针对KMP的改进
回复
fx397993401 2010-07-26
晕 不小心按了确定 还没讲完

//if( pat[j] > 0) return -2;
//else return i-j;
return ((j==b)?(i-b) :-2);

这是我改后过的 却不知为什么
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告