小W与字串小W与字串
这是一道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

相关文章: