BOJ/5430 AC


https://noj.am/5430
この問題もクラスにあるので、できました.
接触し始めたばかりの方法.
問題は要求通りにシミュレーションで解き、タイムアウトしました.
思えば、そうする必要はないと思ったので、考え直した内容は以下の通り.
1.いずれにしても「D」コマンドは、数字全体の前後でのみ削除されます.
2.「R」コマンドが表示されたら、削除の方向を変更します.
3.だから本当に取り除く必要はなく、二重ポインタの感覚で有効な配列の範囲を表す.
4.結果に応じて適切な結果値を出力します.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int tc;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> tc;
    while (tc--) {
        string p; cin >> p;
        int n; cin >> n;

        string temp; cin >> temp;
        vector<int> x;
        int lastcomma = 0;
        for (int i = 0; i < temp.length(); ++i) {
            if ((temp[i] == ',' || temp[i] == ']') && i - lastcomma > 1) {
                x.push_back(stoi(temp.substr(lastcomma + 1, i - lastcomma - 1)));
                lastcomma = i;
            }
        }

        int r = 0, d = 0;
        int f = 0, b = n - 1;
        bool flag = true;
        for (int i = 0; i < p.length(); ++i) {
            if (p[i] == 'R') {
                r++;
                flag = !flag;
            }
            else if (p[i] == 'D') {
                d++;
                if (flag) f++;
                else b--;
            }
        }

        if (f > b + 1)
            cout << "error" << '\n';
        else {
            cout << '[';
            if (flag) {
                for (int i = f; i <= b; ++i) {
                    cout << x[i];
                    if (i != b)
                        cout << ',';
                }
            } else {
                for (int i = b; i >= f; --i) {
                    cout << x[i];
                    if (i != f)
                        cout << ',';
                }
            }
            cout << ']' << '\n';
        }
    }
}