#line 1 "yukicoder-rotate-enlarge_1.test.cpp" #define PROBLEM "https://yukicoder.me/problems/no/565" #line 2 "/mnt/c/Users/shinc/atcoder/library/cpp/matrix.hpp" #include #include #include /** * @brief 行列 * @tparam T 型 行列(グリッド)の要素となるintやchar */ template struct Matrix { std::vector> v; int n, m; /** * @brief コンストラクタ * @param v 行列(グリッド)の元となる vector や vector> * @return Matrix */ template constexpr Matrix(const std::vector& v_) noexcept : n(v_.size()), m(v_.size() == 0 ? 0 : v_[0].size()) { v.resize(n); for(int i = 0; i < n; i++) { v[i].assign(v_[i].begin(), v_[i].end()); } } /** * @brief コンストラクタ * @param _n 行列(グリッド)の行数 * @param _m 行列(グリッド)の列数 * @param _val 行列(グリッド)の要素の初期値 * @return Matrix */ constexpr Matrix(int _n, int _m, T _val) : v(n, std::vector(m, _val)) {} constexpr auto begin() noexcept {return v.begin();} constexpr auto end() noexcept {return v.end();} /** * @brief 行列(グリッド)の行数 * @return size_t */ constexpr size_t size() const {return v.size();} std::vector& operator [] (int i) {return v[i];} /** * @brief 転置 * @return Matrix */ [[nodiscard]] constexpr Matrix transpose() noexcept { if(n == 0) return Matrix(v); std::vector> ret(m); for(int i = 0; i < m; i ++) { ret[i].resize(n); for(int j = 0; j < n; j ++) ret[i][j] = v[j][i]; } return Matrix(ret); } /** * @brief 左右反転 * @return Matrix */ [[nodiscard]] constexpr Matrix rev_lr() noexcept { std::vector> ret = v; for(int i = 0; i < n; i ++) std::reverse(ret[i].begin(), ret[i].end()); return Matrix(ret); } /** * @brief 上下反転 * @return Matrix */ [[nodiscard]] constexpr Matrix rev_ud() noexcept { std::vector> ret = v; reverse(ret.begin(), ret.end()); return Matrix(ret); } /** * @brief 時計周りに90度回転 * @param k 回転する回数 * @return Matrix */ [[nodiscard]] constexpr Matrix rotate(int k) noexcept { k %= 4; if(k == 0) return *this; if(k < 0) k += 4; if(k == 2) return this->rev_lr().rev_ud(); std::vector> ret(m); if(k == 1) { for(int i = 0; i < m; i ++) { ret[i].resize(n); for(int j = 0; j < n; j ++) ret[i][j] = v[n - j - 1][i]; } } else { for(int i = 0; i < m; i ++) { ret[i].resize(n); for(int j = 0; j < n; j ++) ret[i][j] = v[j][m - i - 1]; } } return Matrix(ret); } /** * @brief (i, j)を((i + dy) mod n, (j + dx) mod m)に移動 * @return Matrix */ [[nodiscard]] constexpr Matrix shift(int dy, int dx) noexcept { std::vector> ret = v; for(int i = 0, ni = dy; i < n; i ++, ni ++) { if(ni >= n) ni = 0; for(int j = 0, nj = dx; j < m; j ++, nj ++) { if(nj >= m) nj = 0; ret[ni][nj] = v[i][j]; } } return Matrix(ret); } /** * @brief 左にk回シフト * @return Matrix */ [[nodiscard]] constexpr Matrix shift_l(int k) noexcept { return this->shift(0, -k); } /** * @brief 右にk回シフト * @return Matrix */ [[nodiscard]] constexpr Matrix shift_r(int k) noexcept { return this->shift(0, k); } /** * @brief 上にk回シフト * @return Matrix */ [[nodiscard]] constexpr Matrix shift_u(int k) noexcept { return this->shift(-k, 0); } /** * @brief 下にk回シフト * @return Matrix */ [[nodiscard]] constexpr Matrix shift_d(int k) noexcept { return this->shift(k, 0); } /** * @brief グリッドをvectorで返す * @return std::vector */ [[nodiscard]] constexpr std::vector vstr() noexcept { std::vector ret(n); for(int i = 0; i < n; i ++) { ret[i].assign(v[i].begin(), v[i].end()); } return ret; } /** * @brief グリッドのj列目を返す * @param j 返す列番号(0-indexed) * @return std::vector */ [[nodiscard]] constexpr std::vector col(int j) noexcept { std::vector ret(n); for(int i = 0; i < n; i ++) { ret[i] = v[i][j]; } return ret; } /** * @brief グリッドのi行目をstringで返す * @param i 返す行番号(0-indexed) * @return std::string */ [[nodiscard]] constexpr std::string str(int i) noexcept { std::string ret; ret.assign(v[i].begin(), v[i].end()); return ret; } }; #line 4 "yukicoder-rotate-enlarge_1.test.cpp" #include #line 6 "yukicoder-rotate-enlarge_1.test.cpp" std::string extend(std::string s, int k) { std::string ret = ""; for(char c : s) ret += std::string(k, c); return ret; } int main() { int r, k, h, w; std::cin >> r >> k >> h >> w; std::vector c(h); for(int i = 0; i < h; i ++) std::cin >> c[i]; Matrix mat(c); for(int i = 0; i < r; i += 90) mat = mat.transpose().rev_lr(); for(auto s : mat.vstr()) { std::string t = extend(s, k); for(int i = 0; i < k; i ++) std::cout << t << std::endl; } return 0; }