#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char a[1000005] ,b[10005];//其中a为文本串,b为模式串;
int nxt[10005],n,m;//n代表a的长度,m代表b的长度
void get_nxt()
{
int i=0;
int j=-1;
nxt[0]=-1;//这种版本next里记录的是截至上一位的最长公共前后缀长度
while(i<m)
{
if(j==-1||b[i]==b[j])//匹配或者第一位进入
{
i++;//注意i的延时,错开一个
j++;
nxt[i]=j;//若j==-1,失配后j=0,即前一位无
//j!=-1,则匹配,
}
else
j=nxt[j];//不匹配就跳跃往前找
}
return;
}
int KMP()
{
get_nxt();
int i=0;
int j=0;
int ans=0;
while(i<n)
{
if(j==-1||a[i]==b[j])//第b的一个字符 或本位匹配
{
i++;
j++;
}
else //既然已知本位前一位与最长相同后缀匹配,j不必回头
//本位失配,则找到最长相同前缀的后一位,再匹配
j=nxt[j];
if(j==m)
{
ans++;//return i-j;
j=nxt[j];
}
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s%s",b,a);
m=strlen(b);
memset(nxt,0,sizeof(nxt));
n=strlen(a);
printf("%d\n",KMP());
}
return 0;
}
【HDU 1686】Oulipo KMP模板
最新推荐文章于 2021-09-09 20:53:40 发布