From 689b148736b316e721d6c458a95ee404f56cd01b Mon Sep 17 00:00:00 2001 From: Krosh Date: Sat, 3 May 2025 01:17:58 +0300 Subject: [PATCH] some tasks --- .gitignore | 3 +- contests/2contest/3.cpp | 63 +++++++++++++++++++++++++++++++++++++++++ contests/2contest/4.cpp | 14 +++++---- contests/4contest/3.cpp | 43 +++++++++++++++++++--------- contests/4contest/5.cpp | 45 +++++++++++++++++++++++++++++ 5 files changed, 149 insertions(+), 19 deletions(-) create mode 100644 contests/2contest/3.cpp create mode 100644 contests/4contest/5.cpp diff --git a/.gitignore b/.gitignore index cfe5e57..ffb781c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .vscode run -test \ No newline at end of file +test +*.swp \ No newline at end of file diff --git a/contests/2contest/3.cpp b/contests/2contest/3.cpp new file mode 100644 index 0000000..d016e89 --- /dev/null +++ b/contests/2contest/3.cpp @@ -0,0 +1,63 @@ +#include +#include +#include + +// Напишите программу, которая выполняет RLE-кодирование стандартного потока ввода. + +// При RLE (run length encoding) кодировании последовательность одинаковых идущих подряд символов заменяется на специальный маркер с длиной последовательности. + +// Последовательности одинаковых символов длиной не более 4 остаются без изменений (кроме символа '#'). Последовательности одинаковых символов длиной более 4 заменяются на последовательность символов '#', CHAR, N, '#', где CHAR — это символ, N — число повторений, записываемое в текстовом виде в шестнадцатеричной системе счисления с цифрами 0-9 и a-f. + +// Последовательность символов '#' любой длины кодируется всегда как описано выше. + +// Использовать ввод-вывод языка Си++. + +int main() { + std::string s; + + while (std::cin) { + std::string line; + std::getline(std::cin, line); + s += line + "\n"; + } + + std::string result; + + size_t iter1 = 0; + size_t iter2 = 0; + + while (iter1 < s.size()) { + iter2 = iter1; + while (iter2 < s.size() && s[iter1] == s[iter2]) { + iter2++; + } + int count = iter2 - iter1; + + if (count > 4) { + result += "#"; + result += s[iter1]; + + std::stringstream ss; + ss << std::hex << count; + std::string hexCount = ss.str(); + + result += hexCount; + result += "#"; + } else if (s[iter1] == '#') { + result += "#"; + result += s[iter1]; + result += std::to_string(count); + result += "#"; + } else { + for (int i = 0; i < count; ++i) { + result += s[iter1]; + } + } + + iter1 = iter2; + } + + std::cout << result << std::endl; + + return 0; +} diff --git a/contests/2contest/4.cpp b/contests/2contest/4.cpp index 0f51e31..f06821f 100644 --- a/contests/2contest/4.cpp +++ b/contests/2contest/4.cpp @@ -1,23 +1,27 @@ #include -using namespace std; class BinaryNumber { - string str; + std::string str; public: - BinaryNumber(const string& s = "0") { + BinaryNumber(const std::string& s = "0") { str = s; } - operator string () const { + + operator std::string() const { return str; } + const BinaryNumber& operator++() { - std::string::iterator i = str.end() - 1; + auto i = --str.end(); + while (*i == '1' && i != str.begin()) { *i = '0'; --i; } + if (i == str.begin()) { + *i = '0'; str.insert(str.begin(), '1'); } else { *i = '1'; diff --git a/contests/4contest/3.cpp b/contests/4contest/3.cpp index 28305a7..d355271 100644 --- a/contests/4contest/3.cpp +++ b/contests/4contest/3.cpp @@ -1,22 +1,39 @@ #include -#include #include -#include -void process(const std::vector& mas1, std::vector& mas2) { - std::set set1(mas1.begin(), mas1.end()); +void process(const std::vector& v1, std::vector& v2) { + std::vector copy_v1(v1); + std::sort(copy_v1.begin(), copy_v1.end()); + auto last = std::unique(copy_v1.begin(), copy_v1.end()); + copy_v1.erase(last, copy_v1.end()); - if (set1.empty() || mas2.empty()) { - return; - } + auto iter = --v2.end(); + int num = (int)v2.size() - 1; - for (auto it = mas2.end() - 1; it != mas2.begin() - 1; --it) { - int dst = it - mas2.begin(); - - if (std::find(set1.begin(), set1.end(), dst) != set1.end()) { - mas2.erase(it); + while (iter != --v2.begin()) { + if (std::binary_search(copy_v1.begin(), copy_v1.end(), num)) { + iter = v2.erase(iter); } + + num--; + iter--; } return; -} \ No newline at end of file +} + + +// #include +// int main() { +// std::vector v1 = { 0, 2, 4, 10, -6, 2, 2, 4 }; +// std::vector v2 = { 0, 2, 4, 10, -6, 2, 2, 4 }; + +// process(v1, v2); + +// for (auto& i : v2) { +// std::cout << i << " "; +// } +// std::cout << std::endl; + +// return 0; +// } \ No newline at end of file diff --git a/contests/4contest/5.cpp b/contests/4contest/5.cpp new file mode 100644 index 0000000..135cbfe --- /dev/null +++ b/contests/4contest/5.cpp @@ -0,0 +1,45 @@ +#include +#include + +int main() { + std::list l; + + int n; + std::cin >> n; + + while (n != 0) { + l.push_back(n); + std::cin >> n; + } + + while (std::cin >> n) { + auto iter = l.begin(); + + if (n < 0) { + n = abs(++n); + if ((size_t)n >= l.size()) { + continue; + } + + while (n--) ++iter; + + l.erase(iter); + } else { + int tmp; + std::cin >> tmp; + + --n; + while (n-- && iter != l.end()) ++iter; + + l.insert(iter, tmp); + + // l.insert(); + } + } + + for (auto& i : l) { + std::cout << i << std::endl; + } + + return 0; +}