Official
E - 連長圧縮/Run Length Encoding Editorial
by
E - 連長圧縮/Run Length Encoding Editorial
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()];
}
}
posted:
last update:
