萌新求助,关于本题的一些疑惑

求助,为什么我只有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;
}
全部评论
我打了个暴力匹配也是90分,估计是数据有锅吧
点赞 回复 分享
发布于 2020-06-10 18:17
和AC代码对拍也拍不出来
点赞 回复 分享
发布于 2020-06-10 18:18
点赞 回复 分享
发布于 2020-06-10 18:19

相关推荐

牛客263158796号:我领羊一面后十天不挂也不推进 今天问hr说等前序的第一批意向发完看情况再看是否推进
点赞 评论 收藏
分享
2 1 评论
分享
牛客网
牛客企业服务