题目大意:啥都不说了,就是一个模式匹配
解决:KMP 刚开始一直wa,后来经同学提醒突然想到了溢出了,改了之后,一次就过了
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[1000005],t[10005];
int next[10005],tlen,slen;
void getnext()
{
int i=1,j=0;
next[1]=0;
while(i<=tlen)
{//本来的模式匹配 i < tlen 就结束了,但是为了让模式串结束的时候继续比较,将最需要再添加一个,i=len的时候匹配的地方
if(j==0 || t[i]==t[j])
{
i++;j++;
if(t[i]!=t[j])
next[i]=j;
else next[i]=next[j];
}
else j=next[j];
}
}
int kmp()
{
int i=1,j=1,cnt=0;
while(i<=slen)
{
if(j==0 || s[i]==t[j])
{
i++;j++;
//当模式 串匹配成功的时候,j仍然可以退回到next[j]的位置,继续与主串比较
if(j==tlen+1){ cnt++; j=next[j]; }
}
else j=next[j];
}
return cnt;
}
int main()
{
int icase;
scanf("%d",&icase);
while(icase--)
{
scanf("%s%s",t+1,s+1);
//就因为这个地方把长度存放到s[0],t[0]导致一直wa,原来是由于字符太长导致溢出,放到int中一下就ac了
tlen=strlen(t+1);
slen=strlen(s+1);
getnext();
printf("%d\n",kmp());
}
system("pause");
return 0;
}
浙公网安备 33010602011771号