题目链接:hdu 1686 Oulipo
题意:给你两个串,让你在第二个串中找第一个串,输出找到的个数。
思路:找到一个,次数加一,然后假设这一点没有匹配继续往下找
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1111111
using namespace std;
char s[maxn],p[maxn];
int Next[maxn];
void GetNext()
{
int i=0,j=-1;
int plen=strlen(p);
Next[0]=-1;
while(i<plen)
{
if(j==-1||p[j]==p[i]) i++,j++,Next[i]=j;
else j=Next[j];
}
}
int kmp()
{
int i=0,j=0,cnt=0;
int slen=strlen(s);
int plen=strlen(p);
while(i<slen)
{
if(j==-1||s[i]==p[j]) i++,j++;
else j=Next[j];
if(j==plen) cnt++,j=Next[j];//找到一个子串,次数加一,然后假设这点不匹配,继续往后查找
}
return cnt;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
fill(Next,Next+maxn,0);
scanf("%s%s",p,s);
GetNext();
int cnt=kmp();
printf("%d\n",cnt);
}
return 0;
}