萌新求助,关于本题的一些疑惑
求助,为什么我只有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; }