Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <stack>
- #include <sstream>
- #include <unordered_set>
- bool check(const std::vector<int>& seq) {
- size_t n = (seq.size() + 1) / 2;
- std::vector<bool> is_leave;
- is_leave.reserve(n);
- for (size_t it = 0; it < n; ++it) {
- is_leave.push_back(false);
- }
- std::vector<int> count;
- count.reserve(n);
- for (size_t it = 0; it < n; ++it) {
- count.push_back(0);
- }
- for (auto elem : seq) {
- ++count[elem];
- }
- for (size_t it = 0; it < n; ++it) {
- if (count[it] == 1) {
- is_leave[it] = true;
- }
- }
- std::stack<int> stack;
- for (auto elem : seq) {
- if (is_leave[elem]) {
- continue;
- }
- if (!stack.empty() && stack.top() == elem) {
- stack.pop();
- continue;
- }
- stack.push(elem);
- }
- return stack.empty();
- }
- bool Check(const std::vector<int>& seq) {
- size_t n = (seq.size() + 1) / 2;
- std::vector<bool> is_visited;
- std::unordered_set<int> set;
- is_visited.reserve(n);
- for (size_t it = 0; it < n; ++it) {
- is_visited.push_back(false);
- }
- std::stack<int> stack;
- stack.push(0);
- for (auto elem : seq) {
- if (is_visited[elem]) {
- if (stack.top() == elem) {
- return false;
- }
- stack.pop();
- if (stack.top() != elem) {
- return false;
- }
- } else {
- stack.push(elem);
- is_visited[elem] = true;
- set.insert(elem);
- }
- }
- return set.size() == n;
- }
- std::vector<int> get_numbers(const std::string& str) {
- std::vector<int> res;
- res.reserve(200'000);
- std::stringstream s;
- s << str;
- std::string temp;
- int found;
- while (!s.eof()) {
- s >> temp;
- if (std::stringstream(temp) >> found) {
- res.push_back(found);
- }
- }
- return res;
- }
- int main() {
- std::ios_base::sync_with_stdio(0);
- std::vector<int> seq;
- std::string str;
- getline(std::cin, str);
- seq = get_numbers(str);
- if (Check(seq)) {
- std::cout << "YES";
- } else {
- std::cout << "NO";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement