字符串匹配
动图:https://blog.csdn.net/lxt_Lucia/article/details/79762636
代码:
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 1000003
char F[maxn],T[maxn],P[maxn];
int m,n,d[maxn];
int ans=0,cnt=0;
void getF(char *P,int m)
{
F[1]=0;
for(int i=2;i<=m;++i)
{
int k=F[i-1];
if(P[k+1]==P[i])
++k;
else{
while(k>0&&P[k+1]!=P[i])
k=F[k];
if(P[k+1]==P[i])++k;
}
F[i]=k;
}
}
void getMatch(char*P,int m,char*T,int n)
{
getF(P,m);
int k=0;
for(int i=1;i<=n;++i)
{
while(k&&T[i]!=P[k+1]) k=F[k];
if(T[i]==P[k+1]) ++k;
if(k==m)
{
//printf("matched at %d\n",i-m+1);
d[cnt++]=i-m+1;
ans++;
k=F[k];
//i+=m-1;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s %s",T+1,P+1);
n=strlen(&T[1]);
m=strlen(&P[1]);
getMatch(P,m,T,n);
if(ans)printf("%d\n",ans);
else printf("Not Found\n");
for(int i=0;i<cnt;i++)
printf("%d ",d[i]);
if(n>0)printf("\n");
ans=0;cnt=0;
}
}