Official

B - データ圧縮 / Data Compression Editorial by physics0523


以下の手続きで求めることができます。

  • 便宜上、 \(S\) の末尾にダミー文字を追加する。
  • 最初、文字 \(c=(S\)\(1\) 文字目 \()\)\(cnt=1\) とする。
  • \(S\)\(2\) 文字目以降を前から順に調べる。現在見ている文字を \(s\) とする。
    • \(c=s\) なら \(c\) の連続がまだ続くことが分かる。
      • \(cnt\)\(1\) 加算する。
    • \(c \neq s\) なら \(c\)\(cnt\) 個連続した部分が終わったことが分かる。
      • まず、 \(c\) を出力する。
      • 次に、 \(cnt>1\) であれば \(cnt\) も出力する必要がある。
      • その後、これから始まる連続を調べるために \(c=s,cnt=1\) と更新する。

ダミー文字を入れることで、最後の文字の連続の終わりを楽に検出することができます。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  string S;
  cin >> S;
  S.push_back('$');

  int cnt=1;
  char c=S[0];
  for(int i=1;i<S.size();i++){
    if(c==S[i]){
      cnt++;
    }
    else{
      cout << c;
      if(cnt>1){cout << cnt;}
      c=S[i];
      cnt=1;
    }
  }
  cout << "\n";
  return 0;
}

posted:
last update: