【vjudge训练记录】大一寒假专项训练——set、map

训练情况

A题

字符串去重,我们可以使用set容器进行去重,将每个字符串插入set中,最后输出set容器里面的元素个数就是不同字符串的个数

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

set<string> se;

void solve(){
    int n; cin>>n;
    for(int i = 1;i<=n;i++){
        string s; cin>>s;
        se.insert(s);
    }
    cout<<se.size()<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

B题

这题在数据范围较小的情况下可以用二维数组存,但这题数据范围较大,我们需要使用map进行存储

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    map<int,map<int,int>> s;
    int n,q; cin>>n>>q;
    while(q--){
        int opt; cin>>opt;
        if(opt == 1){
            int i,j,k; cin>>i>>j>>k;
            s[i][j] = k;
        } else if(opt == 2){
            int i,j; cin>>i>>j;
            cout<<s[i][j]<<endl;
        }
    }
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

C题

\(A-B=C\) 移项变成 \(B=A-C\),我们统计数列中 A 的出现次数,然后 C 已知,接下来就是要找有多少个 B(A-C),答案就是它们的和。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

map<int,int> cnt;

void solve(){
    int n,c; cin>>n>>c;
    int a[n+1],ans = 0;
    for(int i = 1;i<=n;i++) cin>>a[i],cnt[a[i]]++;
    for(int i = 1;i<=n;i++) ans += cnt[a[i] - c];
    cout<<ans<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

D题

众所周知二维数组的下标只能是整数,所以维护地点和宝藏名这种字符串类型需要用map,求有多少个宝藏或者至少有一个宝藏的地点我们直接对map求size即可,这里注意一下坑点,如果 if(v[x][y]) x,y均不存在,这种访问未被赋值过的元素会导致size+1,所以查询某个地点的某个宝藏是否存在我们需要使用count判断某个地点是否存在,再判断这个地点是否存在这个宝藏。

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    int q; cin>>q;
    map<string,map<string,bool>> v;
    while(q--){
        int opt; cin>>opt;
        if(opt == 1){
            string s,t; cin>>s>>t;
            v[s][t] = 1;
        } else if(opt == 2){
            string s; cin>>s;
            if(v.count(s)) cout<<v[s].size()<<endl;
            else cout<<0<<endl;
        } else if(opt == 3){
            string s,t; cin>>s>>t;
            if(v.count(s)&&v[s].count(t)) cout<<1<<endl;
            else cout<<0<<endl;
        } else if(opt == 4){
            cout<<v.size()<<endl;
        }
    }
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}
posted @ 2025-01-16 18:00  MNNUACM_2024ZY  阅读(52)  评论(0)    收藏  举报