【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;
}

浙公网安备 33010602011771号