面向对象程序设计(荣誉)实验六 set,bitset,multimap
Posted 上山打老虎D
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象程序设计(荣誉)实验六 set,bitset,multimap相关的知识,希望对你有一定的参考价值。
目录
1. 二进制位取反(bitset)
题目描述
输入10进制非负整数(小于 2 30 2^{30} 230),利用bitset转二进制,并将每位取反输出。注意不可使用循环。
输入
测试次数
每组测试数据,一个10进制非负整数
输出
每组测试数据输出一行,32位计算结果。
样例输入
3
0
32
10
样例输出
11111111111111111111111111111111
11111111111111111111111111011111
11111111111111111111111111110101
题解
#include <iostream>
#include <bitset>
using namespace std;
int main(){
int t,n;
cin >> t;
while(t--){
cin >> n;
bitset<32> a(n);
a.flip();
cout<<a<<endl;
}
return 0;
}
2. 多重集合的简单操作(multiset)
题目描述
在一个给定的多重集合上,可以进行如下三种操作:
1 x表示给集合增加一个元素x;
2表示删除集合中最小的元素(如果集合为空,则什么都不做);
3表示输出集合中最大的元素(如果集合为空,则什么都不做)。
输入
首先输入操作次数t
接下来每行输入一个操作命令
输出
对操作3,输出相应信息。
样例输入
6
1 2
1 3
3
1 3
1 4
3
样例输出
3
4
题解
#include <iostream>
#include <set>
using namespace std;
int main(){
int t,op,n;
cin >> t;
multiset<int> s;
while(t--){
cin >> op;
if(op == 1) {
cin >> n;
s.insert(n);
}
if(op == 2){
if(s.size()){
s.erase(s.begin());
}
}
if(op == 3){
if(s.size()){
cout<<*(s.rbegin())<<endl;
}
}
}
}
3. 单词排序(set)
题目描述
输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出。单词不区分大小写。
smatch是类模板match_results的实例化,模板类。若cin读入多个单词,查regex_search和match_results的suffix方法。
输入
输入一段文本
输出
以从小到大的顺序输出文本中包含的所有单词(不区分大小写)
样例输入
Adventures in Disneyland
Two blondes were going to Disneyland when they came to a fork in the road. The sign read:“Disneyland Left.”
So they went home.
样例输出
a
adventures
blondes
came
disneyland
fork
going
home
in
left
read
road
sign
so
the
they
to
two
went
were
when
题解
#include <bits/stdc++.h>
using namespace std;
int main() {
string word;
set<string> s;
while(cin >> word){
for(int i=0;i<word.size();i++) word[i] = tolower(word[i]);
regex R("[a-z]{1,}");
smatch Mat;
if(regex_search(word, Mat, R))
s.insert(Mat.str());
}
for(auto i:s){
cout<<i<<endl;
}
return 0;
}
4. 求并集(set)
题目描述
给定两个集合,求{A} + {B}.
注:同一个集合中不会有两个相同的元素。
看map课件,集合的并set_union算法和back_insert(迭代器适配器)用法。
输入
每组输入数据分为三行,第一行有两个数字n,m(0<n,m<=10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开.
输出
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开.
样例输入
1 2
1
2 3
1 2
1
1 2
样例输出
1 2 3
1 2
题解
#include <bits/stdc++.h>
using namespace std;
int main() {
set<int> s1,s2,result;
int n,m,cnt=0;
while(cin>>n>>m){
int num;
if(cnt++) cout<<endl;
s1.clear();s2.clear();result.clear();
for(int i=0;i<n;i++){
cin>>num;
s1.insert(num);
}
for(int i=0;i<m;i++){
cin>>num;
s2.insert(num);
}
set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(result, result.begin() ));
int c=0;
for(auto i:result){
if(c++) cout<<" ";
cout<<i;
}
}
}
5. 通讯录(multimap)
题目描述
Cindy的通讯录使用STL中的multimap记录所有好友的所有电话号码。通讯录支持两种查询操作:
1.输入姓名,输出该好友电话号码的个数;
2.输入姓名,输出该好友所有的电话号码。
输入
输入数据第一行为n,表示有n条姓名和对应号码记录。
接下来有n行,每行一个姓名和电话号码。
接下来一行为正整数m,表示查询次数
下面的m行中每行为操作种类(1或者2)和想查询的姓名。
输出
对于第一类操作,输出该姓名有多少个电话号码,每行一个数。
对于第二类操作,输出该姓名所有的电话号码(按输入的顺序),每行一个电话号码,如果不存在则输出None。
样例输入
3
crq 13512345678
yuyu 15988888888
crq 0576-12345678
6
1 crq
1 yuyu
1 kangkang
2 crq
2 yuyu
2 kangkang
样例输出
2
1
0
13512345678
0576-12345678
15988888888
None
题解
#include <bits/stdc++.h>
using namespace std;
int main() {
multimap<string, string> mp;
int n,m;
string name,call;
cin >> n;
for(int i =0; i<n; i++){
cin>>name>>call;
mp.insert(make_pair(name,call));
}
cin >> m;
int op;
for(int i=0;i<m;i++){
cin>>op>>name;
int cnt = mp.count(name);
if(op == 1){
cout<<cnt<<endl;
}
if(op == 2){
if(cnt){
for(auto I = mp.lower_bound(name);I!=mp.upper_bound(name);I++){
cout<<I->second<<endl;
}
}
else cout<<"None\\n";
}
}
return 0;
}
6. 同一集合?(bitset)
题目描述
有n个集合,每个集合有若干个元素,元素值在1-10000之间。给定i和j(0<i,j<10001),求i,j是否属于同一集合?
思路:bitset数组,两个数组按位与,任意1即可。理清bitset数组行列对应什么?
输入
测试数据只有1组,格式如下:
第1行,集合数n(n<1000)
第2行到n+1行,每行1个集合,集合元素数m(1~10000之间), 后跟m个元素,值范围1-10000。
第n+2行,问询次数t,后跟t行,每行两个1-10000之间的数字i j。
输出
对每个问询,输出一行,若i,j同属于1个集合以上(含一个集合),输出i,j同属于哪些集合。若i,j不同属于某一集合,输出no。
样例输入
4
3 10 20 30
4 1 10 5 7
6 12 3 4 5 7 2
2 10 15
3
5 7
10 15
1 3
样例输出
2 3
4
no
题解
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, t, m, num;
cin >> n;
bitset<10005> bit[n],aa,bb;
for(int i = 0; i< n;i++){
cin >> m;
bit[i] &= 0;
for(int j=0;j<m;j++){
cin >> num;
bit[i][num] = 1;
}
}
int a,b,f;
vector<int> ans;
cin >> t;
while(t--){
f=0;
ans.clear();
aa &= 0, bb &= 0;
cin >> a >> b;
aa[a]= 1;
bb[b]= 1;
for(int i =0;i<n;i++){
if((bit[i] & aa)!=0 && (bit[i] & bb)!=0){
f = 1;
ans.push_back(i+1);
}
}
if(f==0) cout<<"no";
else{
for(int i =0; i<ans.size(); i++){
if(i!=0) cout<<" ";
cout<<ans[i];
}
}
if(t!=0) cout<<endl;
}
}
以上是关于面向对象程序设计(荣誉)实验六 set,bitset,multimap的主要内容,如果未能解决你的问题,请参考以下文章
面向对象程序设计(荣誉)实验四 deque,stack,queue