Official
B - データ圧縮 / Data Compression Editorial
by
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=s\) なら \(c\) の連続がまだ続くことが分かる。
ダミー文字を入れることで、最後の文字の連続の終わりを楽に検出することができます。
実装例 (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:
