kmp性质,对于kmp方法的思考过程,性质证明,还是没有搞明白。。。挖个坑
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
char a[200005],b[200005];
int f[200005],ans[200005],n,m,q;
int main()
{
scanf("%d%d%d",&n,&m,&q);
scanf("%s%s",a+1,b+1);
f[1]=0;
int j=0;
for (int i=2;i<=m;i++)
{
while (j&&b[j+1]!=b[i]) j=f[j];
if (b[j+1]==b[i]) j++;
f[i]=j;
}
j=0;
for (int i=1;i<=n;i++)
{
while (j&&b[j+1]!=a[i]) j=f[j];
if (b[j+1]==a[i]) j++;
ans[j]++;
}
int x;
for (int i=m;i>=1;i--) ans[f[i]]+=ans[i];
while (q--) scanf("%d",&x),printf("%d\n",ans[x]-ans[x+1]);
return 0;
}
不会做,不会做的题就hash啊
枚举每个点,二分判断lcp
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
typedef unsigned long long ull;
ull hsa[200005],hsb[200005],po[200005];
int n,m,q,ans[200005];
char ch[200005];
int main()
{
scanf("%d%d%d",&n,&m,&q);
po[0]=1;
for (int i=1;i<=200000;i++) po[i]=po[i-1]*29;
scanf("%s",ch+1);
for (int i=1;i<=n;i++) hsa[i]=hsa[i-1]*29+ch[i]-'a'+1;//尽量不出现代表0的字符
scanf("%s",ch+1);
for (int i=1;i<=m;i++) hsb[i]=hsb[i-1]*29+ch[i]-'a'+1;
for (int i=1;i<=n;i++)
{
int l=0,r=min(m,n-i+1),mid,tt=0;
while (l<=r)
{
mid=(l+r)>>1;
if (hsa[i+mid-1]-hsa[i-1]*po[mid]==hsb[mid]) tt=mid,l=mid+1;
else r=mid-1;
}
ans[tt]++;
}
int x;
while (q--) scanf("%d",&x),printf("%d\n",ans[x]);
return 0;
}