HDU4150的一道算法题,求大神解答,急急急!!!!为何总是wa?

Raise 2014-01-29 04:26:45
http://acm.hdu.edu.cn/showproblem.php?pid=4150
如题,这道题暴力法可解,但是,我认为KMP也是可以解出来的,以下是我写的KMP,总是WA,希望各路大神给bugs,不胜感激!!
#include <iostream>
#include <string.h>
using namespace std;

char str[1000005],pattern[20];
int next[20];
int plen,slen;

void getNext(char *pattern)
{
int i=0,j=-1;
next[0]=-1;
while( i < plen )
{
if( j==-1 || pattern[i] == pattern[j])
{
++i,++j;
next[i]=j;
}
else
{
j=next[j];
}
}
}
char* kmp(char *str, char *pattern)
{
if (!(*pattern) || !(*str))
return NULL;
int i=0,j=0;
getNext(pattern);
while( i < slen && j < plen )
{
if( j== -1 || str[i] == pattern[j] )
{
++i;
++j;
}
else
{
j=next[j];
}
}
if( j == plen )
return str + i-j;
else
return NULL;
}
int main()
{

#ifndef ONLINE_JUDGE
freopen("2.txt","r",stdin);
#endif

int n,sum;
char *p = NULL;

scanf("%d",&n);

while (n--)
{
scanf("%s%s",str,pattern);

slen = strlen(str);
plen=strlen(pattern);

p = str, sum=0;
while (p = kmp(p,pattern)) //str+p可能越界了
{
++sum;
p += plen;
}
cout << sum << endl;
}
return 0;
}

而用string.h的strstr函数就可以AC.不知道两者之前有什么区别啊?
#include <iostream>
#include <string.h>
using namespace std;

char str[1000005],pattern[20];

int main()
{

#ifndef ONLINE_JUDGE
freopen("2.txt","r",stdin);
#endif
int n,sum,len;
char *p = NULL;
scanf("%d",&n);
while (n--)
{
scanf("%s%s",str,pattern);
p = str;
sum = 0,len = strlen(pattern);
while (p = strstr(p,pattern))
{
++sum;
p += len;
}
cout << sum << endl;
}
return 0;
}
...全文
151 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Raise 2014-01-29
  • 打赏
  • 举报
回复
不是吧?哪里出问题了,谢谢
熊熊大叔 2014-01-29
  • 打赏
  • 举报
回复
你的getNext()有问题
Raise 2014-01-29
  • 打赏
  • 举报
回复
问题已经解决了。谢谢

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧