萌新求助,关于本题的一些疑惑
求助,为什么我只有90分呢?是hash被卡了(换了base好像还是不对QAQ)还是算法本身有问题?
大体思路:hash+二分求出最长公共前缀的长度,输出
真诚请求大佬的帮助qwq
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#define LL long long
#define ULL unsigned long long
using namespace std;
int n,q,k;
LL ans,sum;
const int N=4010,mod=1000000007,inv2=(mod+1)/2;
const ULL base=13121;
int len[N],val[N],C[N][N];
vector<ULL>haha[N];
string s[N];
int suan(int x,int y)
{
if(s[x][0]!=s[y][0])return 0;
int l=1,r=min(len[x],len[y]),mid,ans=0;
while(l<=r)
{
mid=(l+r)>>1;
if(haha[x][mid-1]==haha[y][mid-1])ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
void YYCH()
{
C[0][0]=1;
for(int i=1;i<=n;++i)
{
C[i][0]=1;
for(int j=1;j<=i;++j)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
int main()
{
cin>>n>>q;YYCH();
for(int i=1;i<=n;++i)
{
cin>>s[i];len[i]=s[i].length();
ULL t=0;
for(int j=0;j<len[i];++j)
{
t=t*base+s[i][j];
haha[i].push_back(t);
}
}
for(int i=1,tmp;i<=n;++i)
for(int j=i+1;j<=n;++j)tmp=suan(i,j),val[i]+=tmp,val[j]+=tmp;
for(int i=1;i<=n;++i)(sum+=val[i])%=mod;sum=sum*inv2%mod;
while(q--)
{
scanf("%d",&k);
printf("%lld\n",sum*C[n-2][k]%mod);
}
return 0;
}
查看12道真题和解析
