PAT甲级刷题记录 1139 First Contact (30分)(最后一个点超时)

博主在PAT甲级竞赛中遇到1139题,尝试使用unordered_map简化代码,但因unordered_map与pair配合时出现hash冲突导致最后一个点超时。Stack Overflow建议使用邻接表或bool数组代替。尽管代码简洁,但不得不大改,博主选择不改并分享这段经历,强调实战经验的重要性。
摘要由CSDN通过智能技术生成

我的代码大体上与网络上的思路一致
只是想多使用stl简化代码。。
但是久走夜路终闯鬼了
最后一个点超时了
原因是我不能用unordered_map

unordered_map在使用pair时会报错,Stack Overflow上说好像是hash冲突

得换上邻接表或者使用10000*a+b这样的bool数组才行
也就是得大改代码。。
气傻了
不改了
下面是错了一个点的简洁代码
看来通过甲级经验也很重要。
希望对大家有所帮助

#include <bits/stdc++.h>
using namespace std;
int n,m,k;
map< pair<string,bool> , vector<pair<string,bool> > > mp;
string a,b;
priority_queue<pair<string,string> ,vector<pair<string,string> > ,greater<pair<string,string> > > q;
pair<string ,int> pair_make(string a){
    if(a[0]=='-'){
        string b("aaaa");
        for(int i=1;i<=4;i++) b[i-1]=a[i];
        return make_pair(b,true);
    }
    else return make_pair(a,false);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++) {
        cin>>a>>b;
        pair<string,bool> pair1=pair_make(a);
        pair<string,bool> pair2=pair_make(b);
        mp[pair1].push_back(pair2);
        mp[pair2].push_back(pair1);
    }
    cin>>k;
    for(int i=1;i<=k;i++){
        cin>>a>>b;
        pair<string,bool> A=pair_make(a);
        pair<string,bool> B=pair_make(b);
        if(mp.count(A) == 0 || mp.count(B) == 0){
            cout << 0 << endl;
            continue;
        }
        if(mp.count(A) != 0) for(auto j=mp[A].begin(); j != mp[A].end(); j++){
                if(mp.count(*j) != 0) if(*j != B && *j != A && j->second==A.second) for(auto o=mp[*j].begin(); o != mp[*j].end(); o++){
                            if(mp.count(*o) != 0) if(*o != B && *o != A && o->second==B.second) for(auto l=mp[*o].begin(); l != mp[*o].end(); l++)
                                                                if(l->first==B.first) q.push(make_pair(j->first,o->first));
            }
        }
        if(q.empty()) {
            cout << 0 << endl;
            continue;
        }
        cout<<q.size()<<endl;
        while(!q.empty()) cout<<q.top().first<<" "<<q.top().second<<endl,q.pop();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HumorSJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值