🐥

ランレングス圧縮とは?

2024/11/24に公開

ランレングス圧縮とは?

ABC380,381でランレングス圧縮(run length encoding、略してRLE)というアルゴリズムを用いた解き方が説明されていたので、理解する。

以下記事によるとランレングス圧縮とは、同じ文字が連続して何文字出現するを求めるアルゴリズム

ランレングス圧縮(ランレングス符号化)とは、データの圧縮方法の一つで、圧縮前に正確に復元することができる可逆圧縮の一種です。
同じ文字が連続して何文字出現するかに変換します。

https://algo-logic.info/run-length/

例えば、01110001100という文字列の場合、ランレングス圧縮をvector<P<char,int>>で表すとこんな感じ

[('0',1),('1',3),('0',3),('1',2),('0',2)]

RLEのテンプレートコードは以下、そこまで複雑ではない。

string s;
  cin >> s;
  // run length encoding
  vector<pair<char,int>> rle;
  for(char c:s) {
    // サイズチェックをしないとbackメソッドで配列外参照になるためサイズが0でないことを判定
    if (rle.size() && rle.back().first == c) rle.back().second++;
    else rle.emplace_back(c,1);
  }

例題

https://atcoder.jp/contests/abc380/tasks/abc380_c
https://atcoder.jp/contests/abc381/tasks/abc381_c

Discussion