这是一道hash题,其实可以把每个子串都存下来,判断它的开头是不是prefix结尾是不是suffix,这是4题中最简单的一题
#include<bits/stdc++.h>
using namespace std;
#define maxn 2005
map<long long,int>h;
char S[maxn],p[maxn],s[maxn];
int n,n1,n2,ans;
long long hash[maxn],mul[maxn],s1,s2;
long long qianzhuihe(int l,int r)
{
return hash[r]-hash[l-1]*mul[r-l+1];
}
int main(){
scanf("%s%s%s",S+1,p+1,s+1);
n=strlen(S+1);
n1=strlen(p+1);
n2=strlen(s+1);
for(int i=1;i<=n;++i)
hash[i]=hash[i-1]*449+S[i];
for(int i=1;i<=n1;++i)
s1=s1*449+p[i];
for(int i=1;i<=n2;++i)
s2=s2*449+s[i];
mul[0]=1;
for(int i=1;i<=n;++i)
mul[i]=mul[i-1]*449;
for(int i=1;i<=n;++i)
{
for(int j=i;j<=n;++j)
{
if(j-i+1<n1)
continue;
if(j-i+1<n2)
continue;
if(qianzhuihe(i,i+n1-1)==s1&&qianzhuihe(j-n2+1,j)==s2)
{
if(!h.count(qianzhuihe(i,j)))
{
h[qianzhuihe(i,j)]=1;
++ans;
}
}
}
}
printf("%d\n",ans);
return 0;
}
来源:zr