結果
| 問題 | 
                            No.2553 Holidays
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2023-11-18 05:13:04 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 3,204 bytes | 
| コンパイル時間 | 2,492 ms | 
| コンパイル使用メモリ | 214,284 KB | 
| 最終ジャッジ日時 | 2025-02-17 22:27:29 | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 48 WA * 7 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m; cin >> n >> m;
    string s; cin >> s;
    assert(3 <= n && n <= 100000);
    assert(0 <= m && m <= n);
    s += "x";
    map<string, vector<int>> memo;
    for(int l = 0; l < n;){
        int r = l + 1;
        while(r < n && s[l] == s[r]) r++;
        if(s[l] == '-'){
            string t = "";
            if(l == 0) t += "x";
            else t += s[l - 1];
            t += s[r];
            t += ((r - l) % 2) + '0';
            memo[t].push_back(r - l);
        }
        l = r;
    }
    int ans = 0, can_ope = m, cnt = 0;
    for(int i = 0; i < n; i++){
        if(s[i] == 'o'){
            ans++;
        }
    }
    {
        sort(memo["oo1"].begin(), memo["oo1"].end());
        for(auto x : memo["oo1"]){
            int cost = x / 2;
            if(can_ope >= cost){
                ans += x;
            }else{
                ans += can_ope * 2;
            }
            can_ope = max(0, can_ope - cost);
        }
    }
    {
        for(auto x : memo["oo0"]){
            int cost = x / 2;
            if(can_ope >= cost){
                ans += x;
            }else{
                ans += can_ope * 2;
            }
            can_ope = max(0, can_ope - cost);
        }
    }
    {
        for(auto x : memo["ox0"]){
            int cost = x / 2;
            if(can_ope >= cost){
                ans += x;
            }else{
                ans += can_ope * 2;
            }
            can_ope = max(0, can_ope - cost);
        }
    }
    {
        for(auto x : memo["xo0"]){
            int cost = x / 2;
            if(can_ope >= cost){
                ans += x;
            }else{
                ans += can_ope * 2;
            }
            can_ope = max(0, can_ope - cost);
        }
    }
    {
        for(auto x : memo["ox1"]){
            int cost = x / 2;
            if(can_ope >= cost){
                ans += x - 1;
            }else{
                ans += can_ope * 2;
            }
            can_ope = max(0, can_ope - cost);
            cnt++;
        }
    }
    {
        for(auto x : memo["xo1"]){
            int cost = x / 2;
            if(can_ope >= cost){
                ans += x - 1;
            }else{
                ans += can_ope * 2;
            }
            can_ope = max(0, can_ope - cost);
            cnt++;
        }
    }
    {
        sort(memo["xx1"].rbegin(), memo["xx1"].rend());
        for(auto x : memo["xx1"]){
            int cost = (x + 1) / 2;
            if(can_ope >= cost){
                ans += x;
            }else{
                ans += max(0, can_ope * 2 - 1);
            }
            can_ope = max(0, can_ope - cost);
        }
    }
    {
        sort(memo["xx0"].rbegin(), memo["xx0"].rend());
        for(auto x : memo["xx0"]){
            int cost = (x + 1) / 2;
            if(can_ope >= cost){
                ans += x - 1;
            }else{
                ans += max(0, can_ope * 2 - 1);
            }
            can_ope = max(0, can_ope - cost);
            cnt++;
        }
    }
    // ox1, xo1, xx0 の残り
    ans += min(can_ope, cnt);
    cout << ans << endl;
}