Problem:
図書館 2 (Library 2)
問題文
読書好きのビ太郎は図書館で本を借りて読むことにした．ビ太郎の家は狭いため，床には本
1
冊分の広さのスペースしかない．ただし高さは十分にあるため，ビ太郎はこのスペースに本を積んで管理することにした．
ビ太郎はこれから
Q
回の行動を取る．
i
(
1
≦
i
≦
Q
) 回目の行動は文字列
S
i
で表される．
S
i
は 英小文字からなる文字列か
READ
のいずれかであり，その意味は次の通りである．
英小文字からなる文字列の場合，ビ太郎は書名が
S
i
である本を図書館から借り，スペースの一番上に積む．
READ
の場合，ビ太郎はスペースの一番上に積まれている本を読み，図書館に返却する．
あなたはビ太郎がどの本をどのような順番で読んだのかを調べたい．
Q
回の行動の内容が与えられたとき，ビ太郎が読んだ本の書名を読んだ順に出力するプログラムを作成せよ．
制約
2 ≦ Q ≦ 200 000
．
Q
は整数である．
S
i
は長さ
1
以上
10
以下の文字列である (
1 ≦ i ≦ Q
)．
S
i
は英小文字からなる文字列または
READ
である (
1 ≦ i ≦ Q
)．
S
i
が
READ
であるような
i
(
1 ≦ i ≦ Q
) は
1
つ以上存在する．
S
i
が
READ
のとき，必ずスペースに
1
冊以上の本が存在する (
1 ≦ i ≦ Q
) ．
入力
入力は以下の形式で標準入力から与えられる．
Q
S
1
S
2
:
S
Q
出力
標準出力に，
S
i
が
READ
である行動のそれぞれに対して，ビ太郎が読んだ本の書名を順に改行区切りで出力せよ．
入出力例
入力例 1
7
joi
joig
ioi
READ
egoi
READ
READ
出力例 1
ioi
egoi
joig
この入力例ではビ太郎は以下のように行動する．
書名が
joi
である本をスペースに積む．このとき，スペースに積まれている本の書名は
joi
となる．
書名が
joig
である本をスペースに積む．このとき，スペースに積まれている本の書名は上から順に
joig
，
joi
となる．
書名が
ioi
である本をスペースに積む．このとき，スペースに積まれている本の書名は上から順に
ioi
，
joig
，
joi
となる．
書名が
ioi
である本を読んで返却する．このとき，スペースに積まれている本の書名は上から順に
joig
，
joi
となる．
書名が
egoi
である本をスペースに積む．このとき，スペースに積まれている本の書名は上から順に
egoi
，
joig
，
joi
となる．
書名が
egoi
である本を読んで返却する．このとき，スペースに積まれている本の書名は上から順に
joig
，
joi
となる．
書名が
joig
である本を読んで返却する．このとき，スペースに積まれている本の書名は
joi
となる．
よってビ太郎が読んだ本の書名
ioi
，
egoi
，
joig
を順に改行区切りで出力する．
入力例 2
20
one
READ
two
three
four
five
six
seven
READ
eight
nine
READ
ten
eleven
READ
READ
twelve
READ
READ
READ
出力例 2
one
seven
nine
eleven
ten
twelve
eight
six
情報オリンピック日本委員会
作 『第 21 回日本情報オリンピック JOI 2021/2022 二次予選競技課題』

Submitted solutions:

code_snippet: #include<bits/stdc++.h>

using namespace std;

int main () {
    int N;
    cin >> N;
    stack <string> s;
    vector <string> ans;
    for (int i = 0; i < N; i++) {
        string q;
        cin >> q;
        if (q == "READ") {
            ans.push_back(s.top());
            s.pop();
        }
        else {
            s.push(q);
        }
    }

    for (auto i : ans) cout << i << endl;

    return 0;
}
accuracy: 1
time_ms: 90
memory_kb: 12036
final_rank: 11

code_snippet: #include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

int main() {
    int Q;
    cin >> Q;

    stack<string> books;
    vector<string> output;

    string s;
    for (int i = 0; i < Q; i++) {
        cin >> s;
        if (s == "READ") {
            output.push_back(books.top());
            books.pop();
        } else {
            books.push(s);
        }
    }

    for (const string& title : output) {
        cout << title << '\n';
    }

    return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 12492
final_rank: 6

code_snippet: #include "bits/stdc++.h"
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
#define rep(i, m, n) for (ll i = (ll)m; i < (ll)n; i++)
#define drep(i, m, n) for (ll i = m - 1; i >= n; i--)
#define Endl endl
#define all(a) a.begin(), a.end()
#define pr(i, j) make_pair(i, j)
#define isin(x, l, r) (l <= x && x < r)
#define chmin(a, b) a = min(a, b)
#define chmax(a, b) a = max(a, b)
#define srt(ar) sort(ar.begin(), ar.end())
#define rev(ar) reverse(ar.begin(), ar.end())
#define jge(f, s, t) cout << (f ? s : t) << endl
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

#define printar(ar)             \
    do                          \
    {                           \
        for (auto dbg : ar)     \
        {                       \
            cout << dbg << " "; \
        }                       \
        cout << endl;           \
    } while (0)
const ll inf = 1e18;
const ld pi = 3.14159265358979;
const ld eps = 1e-9;
template <class T, ll n, ll idx = 0>
auto make_vec(const ll (&d)[n], const T &init) noexcept
{
    if constexpr (idx < n)
        return std::vector(d[idx], make_vec<T, n, idx + 1>(d, init));
    else
        return init;
}

template <class T, ll n>
auto make_vec(const ll (&d)[n]) noexcept
{
    return make_vec(d, T{});
}
//////////////// 以下を貼る ////////////////
template <class T>
size_t HashCombine(const size_t seed, const T &v)
{
    return seed ^ (std::hash<T>()(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2));
}
/* pair用 */
template <class T, class S>
struct std::hash<std::pair<T, S>>
{
    size_t operator()(const std::pair<T, S> &keyval) const noexcept
    {
        return HashCombine(std::hash<T>()(keyval.first), keyval.second);
    }
};
////////////////////////////////////////////
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll q;
    cin >> q;
    stack<string> st;
    while (q--)
    {
        string s;
        cin >> s;
        if (s == "READ")
        {
            cout << st.top() << endl;
            st.pop();
        }
        else
        {
            st.push(s);
        }
    }
}
accuracy: 1
time_ms: 40
memory_kb: 9856
final_rank: 4

code_snippet: #include <iostream>
#include <stack>
#include <string>

int main()
{
    int n;
    std::string s;
    std::stack<std::string> stk;
    std::cin >> n;
    while (n--) {
        std::cin >> s;
        if (s == "READ") {
            std::cout << stk.top() << std::endl;
            stk.pop();
        } else {
            stk.push(s);
        }
    }
    return 0;
}
accuracy: 1
time_ms: 90
memory_kb: 9768
final_rank: 7

code_snippet: #include <iostream>
#include <string>
#include <stack>

using namespace std;

int main()
{
  int Q;
  string S;
  stack<string> book;

  cin >> Q;

  for (int i = 0; i < Q; i++) {
    cin >> S;

    if (S != "READ") {
      book.push(S);
    } else {
      cout << book.top() << endl;
      book.pop();
    }
  }

  return 0;
}
accuracy: 1
time_ms: 160
memory_kb: 17328
final_rank: 18

code_snippet: #include <iostream>
#include <stack>
using namespace std;
int main(void){
    // Your code here!
    int i,j,a,b,n;
    stack<string> st;
    string s;
    cin >>n;
    for(i=0;i<n;i++){
        cin >> s;
        if(s=="READ"){
            cout << st.top() << endl;
            st.pop();
        }
        else st.push(s);
    }
}
accuracy: 1
time_ms: 160
memory_kb: 17316
final_rank: 17

code_snippet: #include <iostream>
#include <sstream>
#include <stack>
#include <string>

int main() {
  std::cin.tie(nullptr);
  std::ios_base::sync_with_stdio(false);
  std::ostringstream oss;
  std::stack<std::string> stk;
  int Q;
  std::string S;
  std::cin >> Q;
  while (Q--) {
    std::cin >> S;
    if (S == "READ") {
      oss << stk.top() << "\n";
      stk.pop();
    } else {
      stk.push(S);
    }
  }
  std::cout << oss.str();
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 9672
final_rank: 3

code_snippet: #include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    int Q;
    string S;
    vector<string> book;

    cin >> Q;

    for (int i = 0; i < Q; i++){
        cin >> S;
        if (S == "READ"){
            cout << book.back() << endl;
            book.pop_back();
        }
        else {
            book.push_back(S);
        }
    }

    return (0);
}
accuracy: 1
time_ms: 160
memory_kb: 16948
final_rank: 15

code_snippet: #include <bits/stdc++.h>

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using namespace std;
using ll = long long;
using vc = vector<int>;
using vvc = vector<vector<int>>;

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
const long long INF = 1LL << 60;


int main() {

	ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

    int q;
    cin >> q;
    stack<string> stk;
    vector<string> ans(q);
    int cnt = 0;

    for (int i = 0; i < q; ++i) {
        string op;
        cin >> op;
        if (op == "READ") {
            if (!stk.empty()) {
                ans[cnt] = stk.top();
                stk.pop();
                ++cnt;
            }
        }
        else {
            stk.push(op);
        }
    }

    for (int i = 0; i < cnt; ++i) {
        cout << ans[i] << "\n";
    }
    
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 15772
final_rank: 10

code_snippet: #include <iostream>
#include <stack>

using namespace std;

int main()
{
	cin.tie(nullptr);
	ios::sync_with_stdio(false);
	unsigned int Q, i;
	string input;
	stack<string> books;
	cin >> Q;

	for (i = 0; i != Q; ++i)
	{
		cin >> input;
		if (input[0] == 'R') cout << books.top() << '\n', books.pop();
		else books.push(input);
	}

	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 9584
final_rank: 2

code_snippet: #include "bits/stdc++.h"

#define REP(i,num) for(ll i=0;i<(num);++i)
#define FOR(i,c,num) for(ll (i)=(c);(i)<(num);++(i))
#define LOOP(i) while(i--)
#define ALL(c) c.begin(),c.end()
#define PRINTALL(c) for(auto pitr=c.begin();pitr!=c.end();++pitr){cout<<*pitr;if(next(pitr,1)!=c.end())cout<<' ';}cout<<endl;
#define PAIRCOMP(c,comp) [](const pair<ll,ll>& lhs,const pair<ll,ll>& rhs){return lhs.c comp rhs.c;}

using namespace std;
using ll = long long;
using ull = unsigned long long;
using vll = vector<ll>;
using vvll = vector<vector<ll>>;

constexpr ll atcoder_mod = 1e9+7;

template<typename T=ll>
T in(){ T x; cin >> x; return (x); }
template<typename T=ll,typename C=vector<T>>
C vecin(int N){ C x(N);REP(i,N){ x[i]=in<T>(); }return x; }
template<typename T=ll,size_t N>
array<T,N> arrin(){array<T,N> x;REP(i,N){ x[i]=in<T>(); }return x;}

void vout(){ cout << endl; }
template<typename Head,typename... Tail>
void vout(Head&& h,Tail&&... t){ cout << ' ' << h;vout(forward<Tail>(t)...); }
void out(){ cout << endl; }
template<typename Head,typename... Tail>
void out(Head&& h,Tail&&... t){ cout << h;vout(forward<Tail>(t)...); }

template<typename T>
bool chmax(T& a,T b){ if(a<b){ a=b;return true; }return false; }
template<typename T>
bool chmin(T& a,T b){ if(a>b){ a=b;return true; }return false; }

int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);
	cout<<fixed<<setprecision(10);

	auto Q=in();
	stack<string> S;
	LOOP(Q){
		auto T=in<string>();
		if(T=="READ"){
			out(S.top());
			S.pop();
		}
		else{
			S.push(T);
		}
	}
	return 0;
}
accuracy: 1
time_ms: 70
memory_kb: 9520
final_rank: 5

code_snippet: #include <bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
#define REP(i,x) for(int i=0;i<(int)(x);i++)
#define REP1(i,x) for(int i=1;i<=(int)(x);i++)
#define REP2(i,s,e) for(int i=(int)(s);i<=(int)(e);i++)
#define RREP(i,x) for(int i=((int)(x)-1);i>=0;i--)
#define RREP1(i,x) for(int i=((int)(x));i>=1;i--)
#define RREP2(i,s,e) for(int i=((int)(e));i>=(int)(s);i--)
#define ALL(x) (x).begin(),(x).end()
#define INF32 (1000001000)
#define INF (4000000000000001000LL)
template<typename T> inline bool chmax(T &a, T b) { return ((a < b) ? (a = b, true) : (false)); }
template<typename T> inline bool chmin(T &a, T b) { return ((a > b) ? (a = b, true) : (false)); }
#define endl '\n'

int main() {
  ll Q;
  cin >> Q;
  stack<string> stk;
  REP(i, Q) {
    string S;
    cin >> S;
    if (S == "READ") {
      cout << stk.top() << '\n';
      stk.pop();
    } else {
      stk.push(S);
    }
  }
  return 0;
}
accuracy: 1
time_ms: 100
memory_kb: 9656
final_rank: 9

code_snippet: #include <iostream>
using namespace std;
int main(void){

    int q,k=0;
    string s,ans[300000];
    cin>>q;
    for(int i = 0;i < q;i++){
        cin>>s;
        if(s == "READ"){
            k--;
            cout<<ans[k]<<endl;
        }
        else{
            ans[k] = s;
            k++;
        }
    }

return 0;
}
accuracy: 1
time_ms: 160
memory_kb: 17852
final_rank: 19

code_snippet: #include <iostream>
using namespace std;
int main(void){

    int n,j=0;
    string a[210000],b[210000];
    cin>>n;
    for(int i = 0;i < n;i++){
        cin>>a[i];
        if(a[i] == "READ"){
            cout<<b[j-1]<<endl;
            j--;
        }
        else{
            b[j] = a[i];
            j++;
        }
    }

return 0;
}
accuracy: 1
time_ms: 180
memory_kb: 18816
final_rank: 20

code_snippet: #include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <exception>
#include <functional>
#include <iomanip>
#include <ios>
#include <iostream>
#include <map>
#include <memory>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;


using ld = long double;
using ll = long long;
using ull = unsigned long long;

template<class T> using pq = priority_queue<T>;
template<class T> using pqg = priority_queue<T, vector<T>, greater<T>>;

template<class T, class U> inline bool chmin(T& a, const U& b) { if (a > b) { a = b; return 1; } return 0; }
template<class T, class U> inline bool chmax(T& a, const U& b) { if (a < b) { a = b; return 1; } return 0; }

template<class T> auto min(const T& a) { *min_elemenet(all(a)); }
template<class T> auto max(const T& a) { *max_elemenet(all(a)); }

const ll INF = 1 << 30;
const ll INFLL = 1LL << 60;
const ld EPS = 1e-9;
const ll MOD = 1e9 + 7;

#define all(v) begin(v), end(v)

struct UnionFind {
  int n;
  vector<int> parent, siz;
 
  UnionFind(int n) : n(n) {
    parent.resize(n);
    siz.resize(n);
 
    for (int i = 0; i < n; ++i) {
      parent[i] = i;
      siz[i] = 1;
    }
  }
 
  int root(int x) {
    if (parent[x] == x) return x;
    return parent[x] = root(parent[x]);
  }
 
  bool unite(int x, int y) {
    x = root(x);
    y = root(y);
 
    if (x == y) return false;
 
    if (siz[x] < siz[y]) swap(x, y);
    parent[y] = x;
    siz[x] += siz[y];
 
    return true;
  }
 
  int same(int x, int y) {
    return root(x) == root(y);
  }
 
  int size(int x) {
    return siz[root(x)];
  }
};

int main(void) {
  int q;
  cin >> q;

  stack<string> st;

  while (q--) {
    string book;
    cin >> book;

    if (book == "READ") {
      cout << st.top() << endl;
      st.pop();
    } else {
      st.push(book);
    }
  }

  return 0;
}
accuracy: 1
time_ms: 90
memory_kb: 9768
final_rank: 7

code_snippet: #include <iostream>
#include <string>
using namespace std;
int main(void){
    // Your code here!
    int N;
    cin >> N;
    string names[N];
    int count=0;
    string str;
    for(int i=0;i<N;i++){
        cin >> str;
        if (str!="READ"){
            names[count]=str;
            count+=1;
        }else{
            count-=1;
            cout << names[count] << endl;
        }
    }
}
accuracy: 1
time_ms: 160
memory_kb: 17200
final_rank: 16

code_snippet: /* -*- coding: utf-8 -*-
 *
 * 0719.cc: 図書館 2 (Library 2)
 */

#include<cstdio>
#include<string>
#include<stack>
#include<algorithm>
 
using namespace std;

/* constant */

/* typedef */

/* global variables */

/* subroutines */

/* main */

int main() {
  int tn;
  scanf("%d", &tn);

  stack<string> q;

  while (tn--) {
    char s[16];
    scanf("%s", s);
    string t(s);

    if (t == "READ") {
      string w = q.top(); q.pop();
      puts(w.c_str());
    }
    else
      q.push(t);
  }

  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 9352
final_rank: 1

code_snippet: #include<iostream>
using namespace std;
int main(){
    
    int Q;
    cin >> Q;
    string S[Q];
    
    
    for(int i = 0 , j = 0; i < Q ; i++){
        cin >> S[i - 2*j];
        if(S[i - 2*j] == "READ"){
            j++;
            cout << S[i - (2*j - 1)] << endl;
        }
    }
    
    
    
}
accuracy: 1
time_ms: 150
memory_kb: 17212
final_rank: 13

code_snippet: #include<iostream>	
using namespace std;	
int main(){	
 	
	int Q;
  	cin >> Q;
  	string S[Q];
  	int R = 0; // READ の回数をカウント
  	
  	for(int i = 0 ; i < Q ; i++){
    	cin >> S[i - 2*R];
      	if(S[i - 2*R] == "READ"){
        	cout << S[i - 1 - 2*R] << endl;
          	R++;
        }	
    }	
 	
}
accuracy: 1
time_ms: 150
memory_kb: 17188
final_rank: 12

code_snippet: #include<iostream>
using namespace std;
int main(){
    
    int Q;
    cin >> Q;
    string S[Q];
    
    
    for(int i = 0 , j = 0; i < Q ; i++){
        cin >> S[i - 2*j];
        if(S[i - 2*j] == "READ"){
            j++;
            cout << S[i - (2*j - 1)] << endl;
        }
    }
    
    
    
}
accuracy: 1
time_ms: 150
memory_kb: 17212
final_rank: 13