第十一届山东省大学生程序设计竞赛(Birthday Cake)

Birthday Cake

https://ac.nowcoder.com/acm/contest/16092/F

第十一届山东省大学生程序设计竞赛(Birthday Cake)

做法双哈希
由题意可知:有几对字符串可以组成前后一样的字符串,类似于abcabc此类;
解法:if(字符串前后缀相同) 就检查去掉前后缀之后的字符串出现过几次ans+=这个次数;

举个栗子: cabc 这个字符串前后缀 c 相同 就看ab出现过几次 ab和cabc就可以组成abcabc;

#include<bits/stdc++.h>
#include<cstring>
using namespace std;
#define ull unsigned long long 
#define pll pair<ull,ull>
const int maxn=4e5+5;
ull hs1[maxn],hs2[maxn],pec=131,peac1[maxn],peac2[maxn];
ull mod1=1e9+7,mod2=1e9+11;
pll res[maxn];
map<pll, ull> cnt;
ull get1(int l,int r){
    return (hs1[r]-hs1[l-1]*peac1[r-l+1]%mod1+mod1)%mod1;//一定要去两次mod
}
ull get2(int l,int r){
    return (hs2[r]-hs2[l-1]*peac2[r-l+1]%mod2+mod2)%mod2;    
} 
pll get(int l,int r){
    return {get1(l,r),get2(l,r)};
}
int id=0;
int main(){
    peac1[0]=1;
    peac2[0]=1;//初始化进制
    for(int i=1;i<maxn;i++) peac1[i]=peac1[i-1]*pec%mod1;
    for(int i=1;i<maxn;i++) peac2[i]=peac2[i-1]*pec%mod2;
    int n;
    cin>>n;
    while(n--){
        char s[maxn];
        cin>>s+1;
        int len=strlen(s+1);
        for(int i=1;i<=len;i++){
            hs1[i]=(hs1[i-1]*pec%mod1+(s[i]-'a'+1))%mod1;
            hs2[i]=(hs2[i-1]*pec%mod2+(s[i]-'a'+1))%mod2;
        }    
        cnt[{hs1[len],hs2[len]}]++;//记录出现的字符串双哈希
        for(int i=1;i+i<len;i++){
            if(get(1,i)==get(len-i+1,len)){ //前后缀双哈希值相等
                res[++id]=get(i+1,len-i); //存入res数组
            } 
        }
    }
    ull ans=0;
    for(int i=1;i<=id;i++) {  //ans+=出现次数即为所得
        ans+=cnt[res[i]];
    }
    for(auto it : cnt) ans += it.second * (it.second - 1) / 2;
    //如果是相同的字符串就可以组成((n-1)*n)/2个答案
    cout<<ans<<'\n';
}

当我们遇见哈希题时 如果单哈希解决不了 可以试试双哈希来解决 现在大多数出题人喜欢卡单哈希T_T~
祝大家天天AC

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
11-27 12:36
已编辑
门头沟学院 前端工程师
Apries:这个阶段来说,很厉害很厉害了,不过写的简历确实不是很行,优势删掉吧,其他的还行
点赞 评论 收藏
分享
评论
7
收藏
分享
牛客网
牛客企业服务