公式

E - 連長圧縮/Run Length Encoding 解説 by Nyaan


この問題は連長圧縮と呼ばれるアルゴリズムを実装する問題です。連長圧縮は std::vector のような動的配列を利用することで実装することが出来ます。
具体的には次の手順に従って文字列を走査することで、\(S\) を連長圧縮した列を得られます。

  • (文字列, 連続する長さ) の組を管理する配列 rle を用意する。はじめ rle は空である。
  • \(S\) の各文字 c にあついて次の操作を行う。
    • rle が空であるか rle の末尾にある組の文字が c でない場合は、rle の末尾に \((c, 1)\) を push する。
    • そうでない場合は、rle の末尾にある組の連続する長さに \(1\) を加算する。
  • 操作後の rle\(S\) を連長圧縮した列となる。

計算量は \(\mathrm{O}(N)\) で十分高速です。

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

int main() {
  string S;
  cin >> S;
  vector<pair<char, int>> rle;
  for (char c : S) {
    if (rle.empty() or rle.back().first != c) {
      rle.emplace_back(c, 1);
    } else {
      rle.back().second++;
    }
  }
  for (int i = 0; i < (int)rle.size(); i++) {
    cout << rle[i].first << " ";
    cout << rle[i].second << " \n"[i + 1 == (int)rle.size()];
  }
}

投稿日時:
最終更新: