Модуль 1.11 (Словари и множества) в данном модуле будут изучены Множества — это математические структуры, которые могут хранить в себе уникальные элементы.
Ниже представлены примеры задач с решением на C++ на тему Словари и множества.
Дан список целых чисел, который может содержать до 100000 чисел. Определите, сколько в нем встречается различных чисел.
#include <iostream>
#include <set>
using namespace std;
int main() {
set <int> s;
int n,k;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> k;
s.insert(k);
}
cout << s.size();
return 0;
}
Во входной строке записана последовательность чисел через пробел. Для каждого числа выведите слово
YES
(в отдельной строке), если это число ранее встречалось в последовательности илиNO
, если не встречалось.
#include <iostream>
#include <set>
using namespace std;
int main() {
set <int> s;
int n,k;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> k;
int cnt = 0;
for (auto now = s.lower_bound(k); now != s.upper_bound(k); now++) {
cnt++;
}
cnt != 0 ? cout << "YES" : cout << "NO";
cout << endl;
s.insert(k);
}
return 0;
}
Даны два списка чисел, которые могут содержать до 100000 чисел каждый. Посчитайте, сколько чисел содержится одновременно как в первом списке, так и во втором.
#include <iostream>
#include <set>
using namespace std;
int main() {
set <int> s;
int n, k, m;
int cnt = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> k;
s.insert(k);
}
cin >> m;
for (int i = 0; i < m; i++) {
cin >> k;
for (auto now = s.lower_bound(k); now != s.upper_bound(k); now++) {
cnt++;
}
}
cout << cnt << endl;
return 0;
}
Даны два списка чисел, которые могут содержать до 100000 чисел каждый. Выведите все числа, которые входят как в первый, так и во второй список в порядке возрастания.
#include <iostream>
#include <set>
using namespace std;
int main() {
set <int> s, v;
set<int>::iterator ik;
int n, k, m;
int cnt = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> k;
s.insert(k);
}
cin >> m;
for (int i = 0; i < m; i++) {
cin >> k;
for (auto now = s.lower_bound(k); now != s.upper_bound(k); now++) {
v.insert(k);
}
}
for (ik = v.begin(); ik != v.end(); ++ik)
cout << *ik << " ";
return 0;
}
Вам дан словарь, состоящий из пар слов. Каждое слово является синонимом к парному ему слову. Все слова в словаре различны. Для одного данного слова определите его синоним.
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
int n, i;
map <string, string> slovar;
string str1, str2;
cin >> n;
for (i = 0; i < n; i++) {
cin >> str1 >> str2;
slovar[str1] = str2;
}
cin >> str1;
for (auto now : slovar) {
if (str1 == now.first) {
cout << now.second;
}
else if (str1 == now.second) {
cout << now.first;
}
}
return 0;
}
Однажды, разбирая старые книги на чердаке, школьник Вася нашёл англо-латинский словарь. Английский он к тому времени знал в совершенстве, и его мечтой было изучить латынь. Поэтому попавшийся словарь был как раз кстати.
К сожалению, для полноценного изучения языка недостаточно только одного словаря: кроме англо-латинского необходим латинско-английский. За неимением лучшего он решил сделать второй словарь из первого.
Как известно, словарь состоит из переводимых слов, к каждому из которых приводится несколько слов-переводов. Для каждого латинского слова, встречающегося где-либо в словаре, Вася предлагает найти все его переводы (то есть все английские слова, для которых наше латинское встречалось в его списке переводов), и считать их и только их переводами этого латинского слова.
Помогите Васе выполнить работу по созданию латинско-английского словаря из англо-латинского.
#include <iostream>
#include <map>
#include <vector>
#include <string>
using namespace std;
vector<string> get_translate() {
const char delim = ',';
vector<string> v;
string tr;
int prev_pos = 0, pos = 0;
getline(cin, tr);
while ((pos = tr.find(delim, prev_pos)) != string::npos) {
v.push_back(tr.substr(prev_pos, pos - prev_pos));
prev_pos = pos + 2;
}
v.push_back(tr.substr(prev_pos, tr.size() - prev_pos));
return v;
}
map<string, vector<string>>& fill_map(map<string, vector<string>>& m, int n) {
string s;
char delim;
for (int i = 0; i < n; ++i) {
cin >> s >> delim;
cin.get(); // remove space after delimiter
m[s] = get_translate();
}
return m;
}
map<string, vector<string>> eng_to_lat(const map<string, vector<string>>& m) {
map<string, vector<string>> tmp;
for (map<string, vector<string>>::const_iterator it = m.begin(); it != m.end(); ++it) {
for (int i = 0; i < it->second.size(); ++i) {
tmp[it->second[i]].push_back(it->first);
}
}
return tmp;
}
int main() {
int n;
map<string, vector<string>> eng_lat;
map<string, vector<string>> lat_eng;
cin >> n;
eng_lat = fill_map(eng_lat, n);
lat_eng = eng_to_lat(eng_lat);
cout << lat_eng.size() << endl;
for (map<string, vector<string>>::const_iterator it = lat_eng.begin(); it != lat_eng.end(); ++it) {
cout << it->first << " - ";
for (int i = 0; i < it->second.size(); ++i) {
cout << it->second[i];
if (i + 1 < it->second.size()) {
cout << ", ";
}
}
cout << endl;
}
return 0;
}
Учительница задала Пете домашнее задание — в заданном тексте расставить ударения в словах, после чего поручила Васе проверить это домашнее задание. Вася очень плохо знаком с данной темой, поэтому он нашел словарь, в котором указано, как ставятся ударения в словах. К сожалению, в этом словаре присутствуют не все слова. Вася решил, что в словах, которых нет в словаре, он будет считать, что Петя поставил ударения правильно, если в этом слове Петей поставлено ровно одно ударение.
Оказалось, что в некоторых словах ударение может быть поставлено больше, чем одним способом. Вася решил, что в этом случае если то, как Петя поставил ударение, соответствует одному из приведенных в словаре вариантов, он будет засчитывать это как правильную расстановку ударения, а если не соответствует, то как ошибку.
Вам дан словарь, которым пользовался Вася и домашнее задание, сданное Петей. Ваша задача — определить количество ошибок, которое в этом задании насчитает Вася.
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main(){
set <string> voc; //слова с ударениями
set <string> voc1; //слове заглавными буквами
int n, l, i, k, ans = 0, numaccents = 0;
string a, st, check;
bool failed = false;
cin >> n;
//Заполняем словарь
for (i = 0; i < n; i++){
cin >> a;
voc.insert(a);
for (int j = 0; j < a.length(); j++){
st += toupper(a[j]);
}
voc1.insert(st);
st = "";
}
i = 0;
//Обрабатываем слова Васи
while (cin >> a){
if (voc.find(a) == voc.end()){
//Пробегаем по слову
for (k = 0; k < a.length(); k++)
if (a[k] >= 'A' && a[k] <= 'Z'){
numaccents++;
}//Дошли до конца
check = "";
for (int j = 0; j < a.length(); j++){
check += toupper(a[j]);
}
if (numaccents != 1)
failed = true;
else if ((voc1.find(check) != voc1.end()))
failed = true;
if (failed)
ans++;
failed = false; numaccents = 0;
}
}
cout << ans;
return 0;
}
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы