竞赛讨论区 > 萌新求助,关于本题的一些疑惑
头像
wlj_ss
发布于 2020-06-10 16:46
+ 关注

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

求助,为什么我只有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;
}

全部评论

(3) 回帖
加载中...
话题 回帖

本文相关内容

等你来战

查看全部

热门推荐