公式

I - 改行コード/CR LF 解説 by Nyaan


この問題は 2 種類の改行コード (CR, LF) の本来の挙動をテーマとした問題です。
問題文に書かれた内容をナイーブに実装すると\(\mathrm{O}(Q^2)\) の計算量がかかってしまうため、なんらかの高速化が必要です。これは例えば文字列を std::deque<std::string>std::vector<std::string> で管理するなどの方法によって計算量改善が達成できます。(詳細は実装例を参考にしてください)
実装例の計算量は \(\mathrm{O}(Q)\) で十分高速です。

  • 実装例 (C++)
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int H = 0, W = 0;
string cur;
vector<string> buf[1500000 + 3];

int main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  int Q;
  cin >> Q;

  while (Q--) {
    int cmd;
    cin >> cmd;
    if (cmd == 1) {
      char c;
      cin >> c;
      cur.push_back(c);
      W++;
    } else if (cmd == 2) {
      buf[H].push_back(cur);
      cur.clear();
      W = 0;
    } else if (cmd == 3) {
      buf[H].push_back(cur);
      cur.clear();
      H++, W = 0;
    }
  }
  if (!cur.empty()) buf[H].push_back(cur);

  cout << H + 1 << " " << W + 1 << endl;
  for (int i = 0; i <= H; i++) {
    cout << "# ";
    for (int j = (int)buf[i].size() - 1; j >= 0; j--) cout << buf[i][j];
    cout << "\n";
  }
}

投稿日時:
最終更新: