【よくわかる解説!】ABC329 C問題 〜ランレングス圧縮〜

ABC

解説動画はこちら!

コード

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, n) for (int i = 0; i < (n); ++i)

int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;

    vector<pair<char, int>> v;
    v.push_back({s[0], 1});

    // ssskkyskkkkyという文字列に対して
    // v = {{'s', 3}, {'k', 2}, {'y', 1}, {'s', 1}, {'k', 4}, {'y', 1}}というpair型のvectorを作成する
    for (int i = 1; i < s.size(); i++) {
        // 今見ているcharがvの末尾の要素のfirstと等しいのであれば, secondをインクリメントする
        if (v.back().first == s[i]) v.back().second++;
        else {
       // そうでなければ, 要素を追加
            v.push_back({s[i], 1});
        }
    }

    // 上で作成したvに対して
    // al_cnt = {0,0,0,...,4,0,...,3,0,...,1,0} というvectorを作成する
                 a,b,c,...,k,l,...,s,t,...,y,z
    vector al_cnt(26, 0);
    for (auto e : v) {
        al_cnt[e.first - 'a'] = max(al_cnt[e.first - 'a'], e.second);
    }

    int ans = 0;
    for (auto e : al_cnt) ans += e;

    cout << ans << endl;
    return 0;
}

コメント