昨晚本来想看一下数据结构的作业……突然发现第三章有KMP算法,抱着慕名已久的心态一看就入迷……(突然发现吉大的数据结构书貌似还不错)
看完理解算法的步骤之后开始写自己实现代码。。。
期间虽然偷偷瞄过几眼书上那ADT代码,绝大部分还是自己写得。
鉴于这道题是KMP水题(只是用来看看自己写得KMP对不对……)我就不解释什么了。自己上网看懂KMP教程就ok。
照旧:不建议观摩他人代码=。 =
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int Max = 1001000;
int next[Max];
char s[Max],p[Max];
int ans = 0;
void make_next()
{
memset(next, 0, sizeof(next));
next[0] = -1;
// for(int i=1; i<p.length(); i++)
for(int i=1; p[i] != 0; i++)
{
int j = i-1;
while(j>=0 && p[next[j]+1] != p[i])
j = next[j];
if(p[j+1] == p[i])
next[i] = next[j]+1;
else
next[i] = -1;
}
}
void kmp()
{
int vis = 1;
int top_p = 0;
int top_s = 0;
// while(top_s < s.length())
while(s[top_s] != 0)
{
if(s[top_s] == p[top_p])
{
top_s++;top_p++;
// if(top_p == p.length())
if(p[top_p] == 0)
{
ans++;
top_p = next[--top_p] + 1;
}
continue;
}
else
{
// while(top_p>0 && s[top_s] != s[next[top_p-1]+1])
// top_p = next[top_p - 1] + 1;
if(top_p==0)
{
if(s[top_s+1] == 0) break;
else top_s++;
}
else if(top_p < 0)
break;
else
top_p = next[top_p-1] + 1;
// top_p = next[--top_p]+1;
}
}
}
int main()
{
// freopen("123.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s %s",p,s);
ans = 0;
make_next();
// for(int i=0; p[i]!=0; i++)
// printf("next[i]:%d\n",next[i]);
kmp();
printf("%d\n",ans);
}
}