· · 个人记录

1.月(moon.cpp)

题目背景

  说起月,pureElysia 就想起了 kiana 。这个名字是多么好听,不过对于pureElysia 来说,独属于他的月光之神,他早已遇见。

  话说,崩坏三的剧情在3月3日在剧情PV《毕业旅行》后,落下了一个平淡圆满的句号。这时,他把目光投向了《崩坏星穹铁道》。

  众所周知,星穹铁道是在延续崩三的世界观,于是乎,崩P作为前辈就有一种不太应该的优越感。

  然而呢,铁P作为新兴事物,自然也瞧不起现在的大头《原神》。

  原P呢?毕竟实在过于成功,反而对崩三不屑一顾。

  现在机房坐了一列的米卫兵,这一列有 n 个人,机房有 n 列。此后,每一列都会比上一列少一个人。显而易见,第 n 列只有一个人。猜猜他是谁?没错,就是强哥desu!

  米卫兵那一列,每个人推且推一款米家游戏。但他们都是小鬼,就只知道个崩三原神铁道,崩二鹿鸣未定崩一flyme2themoon完全为所未闻。pure__Elysia 作为拱火带师,煽风点火让他们打起来。注意,只有坐在一起的米孝子才会打起来,且左右都会打。

  打的规则如下,坐在一起的两个米卫兵打一架,OP打赢BP,BP打赢TP,TP打赢OP。打赢之后,他们每个人还是君子固穷,坚守本心。但是下一列中,坐在这两个米卫兵之间的人一看,不行,我要变成打赢了的那个小鬼的样子。等到一列打完之后,嘿嘿嘿, pureElysia 就会再次煽风点火,让这一列也开始世纪大战。不过之前那些打过的列早已看清 pureElysia 乐子人的本质,因此不会受影响打架了。

  这样一列一列打下来,你猜怎么这,强哥也变成米卫兵喽。现在 pure__Elysia 很关心,强哥会喜欢什么游戏。

  没理解到?可以看看样例的图解哦。

题目描述

  给出 n,以及米卫兵列的推游戏情况。分别用 O,B,T 表示OP,BP,TP。

  这样的世纪大战传教会进行 T 次,请输出每一次强哥会选择的游戏。

输入输出格式

  输入第一行,为数据组数 T

  对于每组数据,对应两行输入,其中,第一行为列的长度 n ,第二行为一个长度为 n 的字符串,由字母“O,B,T”构成。

  对于每组数据,要求输出一行一个字符,表示强哥会选择的游戏。

数据范围

对于 15%的数据 T = 1 , 1 \leq n \leq 100

对于 30%的数据 1 \leq T \leq 101 \leq \sum n \leq 1000

对于 50%的数据 1 \leq T \leq 301 \leq \sum n \leq 15000

对于 70%的数据 1 \leq T \leq 501 \leq \sum n \leq 1e6

对于 100%的数据 1 \leq T \leq 1001 \leq \sum n \leq 1e8 , n \leq 1e6

样例输入1

1
9
BBOTBOTTB

样例输出1

B

样例输入2

2
6
BOTBBO
5
TTOBO

样例输出2

O
T

样例解释1

样例解释2

浪费你时间的小小插曲

  这其实是去年2022年CCPC的一道题。别的组都是3人参赛,只有我们组是两人,本来我和瓜瓜两个人就不是很想去了,但是在强哥的劝说下毅然参赛。

  直接说结果吧,我们两个人,和其他三人组最高战绩一样(虽然是时间是A四道题中最慢的的说),A了四道题(趁瓜瓜不在,吹一手,代码都是我写的)。并且有三道是一遍过。这道就是我们唯一没有一遍过的题。

  最刺激的是,这道题是我们最后30min,反正也不怕罚时了,反复乱交,结果在最后两分钟!!!!倒数第2min给A掉了!!!

  这时,小陈“喜欢的OI好题”列表里就多了这么一道题。

STD1 手写栈

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;

//#define int long long 开不得,容易爆内存 
//#define ri register int

inline int rd()//快读版子,总得选一个你喜欢的版本背住 
{
    int a=0,f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) a=(a<<1)+(a<<3)+c-'0';
    return a*f;
}

char st[1000005],c;//栈 
int tot; 

inline bool win()
{
    if(c=='O'&&st[tot-1]!='T')
        return 1;
    if(c=='T'&&st[tot-1]!='B')
        return 1;
    if(c=='B'&&st[tot-1]!='O')
        return 1;
    return 0;
}

signed main()
{

    int T=rd();
    while(T--)
    {
        tot=0;
        int n=rd();

        for(int i=1;i<=n;i++)
        {
            cin>>c;
            while(tot!=0&&win())
                tot--;
            st[tot++]=c;
        }

        cout<<st[0]<<endl;

    }

    return 0;
}