Решение модуля 1.11 Введение в программирование C++

Модуль 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;
}

Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы

Понравилась статья? Поделиться с друзьями:
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x