面向对象程序设计(荣誉)实验六 set,bitset,multimap

简介: 面向对象程序设计(荣誉)实验六 set,bitset,multimap

1. 二进制位取反(bitset)


题目描述


输入10进制非负整数(小于2 30 2^{30}2

30

),利用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;
    }
}
相关文章
|
存储 C++ 容器
map、set、multimap和multiset的使用【STL】
map、set、multimap和multiset的使用【STL】
40 0
|
6月前
|
存储 自然语言处理 C++
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
47 0
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
|
7月前
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(下)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
49 1
|
7月前
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(中)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
50 1
|
7月前
|
存储 自然语言处理 C语言
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(上)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
64 1
|
7月前
|
存储 C++ 容器
【C++初阶】STL详解(十)set、map、multiset、multimap的介绍及使用
【C++初阶】STL详解(十)set、map、multiset、multimap的介绍及使用
79 0
|
存储 编译器 对象存储
详解map、set、multimap、multiset的使用
详解map、set、multimap、multiset的使用
198 0
|
存储 算法 编译器
【C++】map、set、multimap、multiset的介绍和使用
【C++】map、set、multimap、multiset的介绍和使用
|
数据格式
面向对象程序设计(荣誉)实验七 unordered_set
面向对象程序设计(荣誉)实验七 unordered_set
111 0
面向对象程序设计(荣誉)实验七 unordered_set
|
C++ 容器 存储
STL容器(Stack, Queue, List, Vector, Deque, Priority_Queue, Map, Pair, Set, Multiset, Multimap)
一、Stack(栈) 这个没啥好说的,就是后进先出的一个容器。 基本操作有: 1 stackq; 2 q.push(1); //入栈 3 q.pop(); //出栈 4 q.
1502 0