11.2模拟赛总结

题目难度:绿,上篮/下紫,蓝,紫
预估得分:70+30+0+0
实际得分:30+0+0+0
先通读了一遍t1,t2,想出来t1O(n^2)(70) ,t2特殊性质12(30)的解法,斟酌后决定先写t1的部分分(70),代码因编译器报错(实际上没错)调了很久,大概10:30写完。开始写t2部分分,大概11:30写完,看了看剩下的部分分感觉都写不完,但最后还是去写了t3的部分分(没写完)。

t1

看到n^2的做法和线性差距不大时就没再去想正解,想到写法是枚举所有单词+unordered_map。忘记了unordered_map最差的时间复杂度为O(n),70->30

当时写的代码
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int N=1e6+10,H=131;
unordered_map<ull,bool>mp;
char a[N],b[N];
ull hasha[N],hashb[N],powh[N];
int main(){
    freopen("string.in","r",stdin);
    freopen("string.out","w",stdout);
    scanf("%s",a+1); scanf("%s",b+1);
    int la=(int)strlen(a+1),lb=(int)strlen(b+1);
    ull ans=1;
    for(int i=1;i<=la;++i){
        hasha[i]=hasha[i-1]*H+a[i];
        if(!mp[hasha[i]]){
            ans++; mp[hasha[i]]=1;
        }
    }
    powh[0]=1;
    for(int i=1;i<=la;++i) powh[i]=powh[i-1]*H;
    for(int i=lb;i>=1;--i){
        hashb[i]=b[i]*powh[lb-i]+hashb[i+1];
        if(!mp[hashb[i]]){
            ans++; mp[hashb[i]]=1;
        }
    }
    for(int i=1;i<=la;++i){
        for(int j=lb;j>=1;--j){
            if(!mp[hasha[i]*powh[lb-j+1]+hashb[j]]){
                ans++; mp[hasha[i]*powh[lb-j+1]+hashb[j]]=1;
            }
        }
    }
    cout<<ans;
    
    return 0;
}

正解

不知为何理解了很久,一直没太搞懂类似a=ab,b=ab的情况
代码
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int N=1e6+10,H=131;
unordered_map<ull,bool>mp;
char a[N],b[N];
ull hasha[N],hashb[N],powh[N];
int main(){
    freopen("string.in","r",stdin);
    freopen("string.out","w",stdout);
    scanf("%s",a+1); scanf("%s",b+1);
    int la=(int)strlen(a+1),lb=(int)strlen(b+1);
    ull ans=1;
    for(int i=1;i<=la;++i){
        hasha[i]=hasha[i-1]*H+a[i];
        if(!mp[hasha[i]]){
            ans++; mp[hasha[i]]=1;
        }
    }
    powh[0]=1;
    for(int i=1;i<=la;++i) powh[i]=powh[i-1]*H;
    for(int i=lb;i>=1;--i){
        hashb[i]=b[i]*powh[lb-i]+hashb[i+1];
        if(!mp[hashb[i]]){
            ans++; mp[hashb[i]]=1;
        }
    }
    for(int i=1;i<=la;++i){
        for(int j=lb;j>=1;--j){
            if(!mp[hasha[i]*powh[lb-j+1]+hashb[j]]){
                ans++; mp[hasha[i]*powh[lb-j+1]+hashb[j]]=1;
            }
        }
    }
    cout<<ans;
    
    return 0;
}

t2

想出了特殊性质AB,
sort(wp+1,wp+tot+1);->sort(wp+1,wp+n+1); 30->25
因苹果用不了万能头而没用万能头,25->0

30pts
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int N=1e6+10,H=131;
unordered_map<ull,bool>mp;
char a[N],b[N];
ull hasha[N],hashb[N],powh[N];
int main(){
    freopen("string.in","r",stdin);
    freopen("string.out","w",stdout);
    scanf("%s",a+1); scanf("%s",b+1);
    int la=(int)strlen(a+1),lb=(int)strlen(b+1);
    ull ans=1;
    for(int i=1;i<=la;++i){
        hasha[i]=hasha[i-1]*H+a[i];
        if(!mp[hasha[i]]){
            ans++; mp[hasha[i]]=1;
        }
    }
    powh[0]=1;
    for(int i=1;i<=la;++i) powh[i]=powh[i-1]*H;
    for(int i=lb;i>=1;--i){
        hashb[i]=b[i]*powh[lb-i]+hashb[i+1];
        if(!mp[hashb[i]]){
            ans++; mp[hashb[i]]=1;
        }
    }
    for(int i=1;i<=la;++i){
        for(int j=lb;j>=1;--j){
            if(!mp[hasha[i]*powh[lb-j+1]+hashb[j]]){
                ans++; mp[hasha[i]*powh[lb-j+1]+hashb[j]]=1;
            }
        }
    }
    cout<<ans;
    
    return 0;
}
posted @   叫塞尔达的林克  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示