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: