Задача A. Шифр Цезаря

Входной файл:input.txt   Ограничение времени:60 сек
Выходной файл:output.txt   Ограничение памяти:4000 Мб

Условие

Необходимо реализовать функцию CaesarEncrypt обрабатывающую шифром Цезаря (правый сдвиг на 3) входную строку в несколько потоков

Гарантируется, что строка будет состоять только из маленьких латинских букв в кодировке ASCII

        
            void CaesarEncrypt(std::string* s);
        
    

Функция должна отрабатывать быстрее (по системному времени), чем следующая:

        
            void CaesarEncryptOneThread(std::string* s)
            {
                for (char& c : *s)
                    c = 'a' + (c + 3 - 'a') % 26;
            }
        
    

Материалы задачи

main.cpp task.xml gen.cpp sol.cpp

Формат выходного файла

Файл с решением должен содержать функцию CaesarEncrypt


Задача B. Параллельное перемножение матриц

Входной файл:Стандартный вход   Ограничение времени:15 сек
Выходной файл:Стандартный выход   Ограничение памяти:4000 Мб

Условие

Вам дан класс с основными функциями для реализации матриц со следующим интерфейсом.

        class DenseMat {
          public:
            DenseMat(int32_t rows = 0, int32_t cols = 0);
            DenseMat(int32_t rows, int32_t cols, const std::vector<int32_t>& data);

            int32_t Rows() const;
            int32_t Cols() const;

            const int32_t& operator()(int row, int col) const;
            int32_t& operator()(int row, int col);

            bool operator==(const DenseMat& other) const;
                  bool operator!=(const DenseMat& other) const;
        };
      

Требуется реализовать функцию DenseMat MatMulParal(const DenseMat& a, const DenseMat& b, int thread_count); , которая выдает результат умножения матрицы a на матрицу b.

Функция должна использовать алгоритм параллельного умножения матриц, используя thread_count потоков. При перемножении матриц вычисление каждого i, j-го элемента матрицы-результата не зависит от порядка вычисления остальных элементов, поэтому вы можете вычислять отдельные части матрицы-результата независимо в разных потоках без синхронизации между ними.

Тестирующая система будет проверять, что:

Материалы задачи

main.cpp task.xml

Задача C. Queue

Входной файл:Стандартный вход   Ограничение времени:5 сек
Выходной файл:Стандартный выход   Ограничение памяти:4000 Мб

Условие

Вам необходимо реализовать thread-safe очередь со следующими методами:


        template <typename T>
        class Queue {
        public:
            T Pop();
            
            size_t Size();
            
            template <typename U>
            void Push(???);
            
            template <typename ... U>
            void Emplace(???);
        };
    

Очередь должна уметь работать с объектами без конструктора копирования.

Материалы задачи

main.cpp task.xml

0.221s 0.019s 33