結果

問題 No.3015 右に寄せろ!
ユーザー 回転
提出日時 2025-01-25 16:48:31
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 1,102 bytes
コンパイル時間 1,041 ms
コンパイル使用メモリ 66,176 KB
実行使用メモリ 39,888 KB
最終ジャッジ日時 2025-01-25 23:55:50
合計ジャッジ時間 38,316 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 25 TLE * 11
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// スタックと結果をグローバルで保持
vector<char> stack;
long long ans = 0;

void f() {
    ans++;
    // スタックから3つ取り除く
    for (int i = 0; i < 3; ++i) stack.pop_back();
    // "0"をスタックに追加
    stack.push_back('0');

    // 再帰処理
    if (stack.size() > 2) {
        if (stack[stack.size() - 3] == '1' && stack[stack.size() - 2] == '1' && stack[stack.size() - 1] == '0') {
            f();
        }
    }

    // "1", "1"をスタックに追加
    stack.push_back('1');
    stack.push_back('1');
}

int main() {
    string S;
    cin >> S;

    for (char c : S) {
        stack.push_back(c);
        // スタックのサイズが2以下の場合はスキップ
        if (stack.size() <= 2) continue;

        // 末尾3つが"1", "1", "0"の場合、関数fを呼び出す
        if (stack[stack.size() - 3] == '1' && stack[stack.size() - 2] == '1' && stack[stack.size() - 1] == '0') {
            f();
        }
    }

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