| | {quote} |
| | set - множество - хранит упорядоченные по возрастанию элементы в виде дерева каждый ровно один раз |
| | multiset - мультимножество - хранит упорядоченные по неубыванию элементы в виде дерева |
| | каждый элемент может встречаться несколько раз |
| | {quote} |
| | Объявление |
| | {quote} |
| | set<string> s; // множество строк, строки упорядочены по возрастанию |
| | // добавление одинаковых игнорируется |
| | // каждое строка может встречаться один раз |
| | multiset<int, greater<int> > s; // множество чисел, числа упорядочены по убыванию |
| | // одинаковые числа добавляются |
| | // каждое число может встречаться несколько раз |
| | {quote} |
| | Использование |
| | {quote} |
| | s.insert(t) // вставить элемент t в множество s |
| | s.find(t) // найти t в s |
| | проверить, есть ли элемент t во множестве s |
| | нет, если s.find(t)==s.end() |
| | есть, если s.find(t)\!=s.end() |
| | s.end - адрес "сразу за последним элементом " |
| | s.erase(s.find(h)) // найти в s элемент h и удалить его |
| | s.erase(h) // в multiset удаляет все элементы со значением h |
| | s.clear() // удалить все элементы из s |
| | s.empty() // множество пустое? |
| | s.size() // количество элементов в s |
| | |
| | \*s.begin() // взять первый - наименьший элемент из s (если элементы хранятся по возрастанию) |
| | // - наибольший элемент из s (если элементы хранятся по убыванию) |
| | \*s.rbegin() // взять последний |
| | \*--s.end() // взять последний - наибольший элемент из s (если элементы хранятся по возрастанию) |
| | // - наименьший элемент из s (если элементы хранятся по убыванию) |
| | // s.end - адрес "сразу за последним элементом" |
| | {quote} |
| | Заметим, что первый, последний элементы и empty берутся за O(1), |
| | |
| | а insert, find, erase выполняются за O(LogN) |
| | {code:title=part.cpp|borderStyle=solid} |
| | set <pair< pair<int,int> , pair<int,int> > > s; // множество четвёрок чисел |
| | set <pair< pair<int,int> , pair<int,int> > >::iterator is; // итератор по множеству |
| | for (is=s.begin(); is!=s.end(); is++) |
| | for (is=s.begin(); is!=s.end(); is++) |
| | { |
| | int x1,y1,x2,y2; |
| | x1=is->first.first; // обращение к элементам четвёрки |
| | y1=is->first.second; // с помощью итератора |
| | x2=is->second.first; |
| | y2=is->second.second; |
| | {code} |
| | Задача из курса "Методы алгоритмизации" |
| | Олимпиады по информатике\Стек\07_Rub6 - "aPhone |
| | [http://dl.gsu.by/task.jsp?nid=256579&cid=15] |
| | |
| | Решение |
| | |
| | Можно симулировать процесс, описанный в условии задачи. |
| | |
| | А можно заметить, что если сначала все строки прочитать, |
| | а потом обрабатывать их с конца, то задача может существенно упроститься |
| | Список строк пустой |
| | Пока не обработали все строки |
| | - если текущей строки нет, |
| | Тогда выводим её, и заносим её в список |
| | иначе пропускаем |
| | Довыводим <Empty> если нужно |
| | |
| | Для того, чтобы не писать самим процедуры |
| | добавления строки в список проверки и проверки наличия строки в списке |
| | (а также для ускорения этих процедур) можно |
| | определить тип множество строк (set<string> s) |
| | и использовать стандартные функции. |
| | s.insert(t) - вставить строку t в множество s |
| | s.find(t) - проверить, есть ли строка t во множестве s |
| | есть, если s.find(t)==s.end() |
| | {code:title=prog.cpp|borderStyle=solid} |
| | #include <bits/stdc++.h> |
| | using namespace std; |
| | string x[1000]; |
| | set<string> s; |
| | int main() |
| | { |
| | freopen("aphone.in","r",stdin); |
| | freopen("aphone.out","w",stdout); |
| | int n,m,i; |
| | cin >> m >> n; |
| | for (i=0; i<n; i++) cin >> x[i]; |
| | for (i=n-1; (i>=0) && (m>0); i--) |
| | if (s.find(x[i])==s.end()) |
| | { s.insert(x[i]); cout << x[i] << endl; m--;}; |
| | for (i=0; i<m; i++) cout << "<Empty>" << endl; |
| | } |
| | {code} |
| | Подробнее о set |
| | [http://informatics.mccme.ru/mod/book/view.php?id=492&chapterid=215] |