Official

E - 前から3番目 / Third from Front Editorial by tatyam


この問題は、deque というデータ構造を用いると、先頭 / 末尾 への 挿入 / 削除 がならし計算量 \(O(1)\) で行えるので、全体で \(O(N)\) で解くことができます。
そのほか、deque の代わりに、前後に \(N\) 個ずつ余分な長さを持たせた空の配列を使うこともできます。

回答例 (C++)

#include <iostream>
#include <deque>
using namespace std;

int main(){
    int N;
    string S;
    cin >> N >> S;
    deque<int> q;
    for(int i = 0; i < N; i++){
        switch(S[i]){
        case 'L':
            q.push_front(i + 1);
            break;
        case 'R':
            q.push_back(i + 1);
            break;
        case 'A':
        case 'B':
        case 'C':
            {
                const int x = S[i] - 'A';
                if(q.size() <= x) puts("ERROR");
                else{
                    cout << q[x] << ' ';
                    q.erase(q.begin() + x);
                }
                break;
            }
        case 'D':
        case 'E':
        case 'F':
            {
                const int x = S[i] - 'D';
                if(q.size() <= x) puts("ERROR");
                else{
                    cout << q.end()[~x] << ' ';
                    q.erase(q.end() - 1 - x);
                }
                break;
            }
        }
    }
}

回答例 (Python)

N = int(input())
S = input()
a = [0] * N
l = 0
r = 0
for i in range(N):
    c = S[i]
    if c == 'L':
        l -= 1
        a[l] = i + 1
    elif c == 'R':
        a[r] = i + 1
        r += 1
    elif ord(c) < 68:
        x = ord(c) - 65
        if r - l <= x:
            print("ERROR")
            continue
        print(a[l + x])
        for j in range(x, 0, -1):
            a[l + j] = a[l + j - 1]
        l += 1
    else:
        x = ord(c) - 68
        if r - l <= x:
            print("ERROR")
            continue
        print(a[r - 1 - x])
        for j in range(x, 0, -1):
            a[r - 1 - j] = a[r - j]
        r -= 1

posted:
last update: