EOJ Monthly 2020.7 A. 打字机

Posted hhlya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EOJ Monthly 2020.7 A. 打字机相关的知识,希望对你有一定的参考价值。

题面

Cuber QQ 长期在网络上与他人对线,一天,他发明了一台神奇的打字机。这台打字机只能处理由 a,b,X 构成的字符串。具体来说,打字机能够执行如下三种操作。

操作:将任意一个 X 替换为 aX 。
操作:将任意一个 X 替换为 aXbX 。
操作:删除任意一个 X 。
打字机启动时,屏幕上有且仅有一个 X 。

现在 Cuber QQ 想要打出一个仅包含 a , b 的字符串 。但是他有选择困难症,注意到,操作 和操作 都能生成字符 a 。如果 中的某个 a 既可以通过操作 得到,又可以通过操作 得到,Cuber QQ 就会因为难以抉择而不快乐。

Cuber QQ 为了向你详细说明这一点,他决定把操作 生成的 a 标记为 ,把操作 生成的 a 标记为 。在这种表示下,Cuber QQ 是否快乐等价于通过各种操作方式(如果存在)生成的字符串 是否完全一样。

现在 Cuber QQ 把这个字符串 告诉你,请你告诉他,他是否能成功打出这个字符串,如果能够打出这个字符串,你还要告诉他,他是否快乐。

输入格式
本题有多组测试数据,第一行包含一个整数 ()

之后 行,每行是一个仅包含 a , b 的字符串 ()

数据保证所有字符串的长度之和 。

输出格式
输出 行,分别对应每组数据。

如果Cuber QQ可以打出这个字符串,并且开心,输出 Happy Fang。

如果Cuber QQ可以打出这个字符串,但不开心,输出 Sad Fang。

如果Cuber QQ无法打出这个字符串,输出 Dead Fang

思路

我们会发现,一个b的出现,在其前面肯定有一个a,那么去check每个b的前面,如果都只有一个a,那么这个肯定是一个最好的局面,否则的话他有可能是通过a去加出来的。代码实现我们维护一个stack,遇到b的时候就弹出一个a,a就入栈,遍历完所有b后,如果栈非空,那么就是一个sad局面。我们需要简化问题给定操作,比如1和3结合可以把任意x变成a,以及提取题目中的信息,也可能的非法情况,我们需要去模拟怎样会产生这种情况,再加以思考。

代码实现

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<stack>
using namespace std;
const int maxn=101;


int main () {
    int t;
    cin>>t;
    while (t--) {
        string str;
        cin>>str;
        int len=str.length ();
        int d=-1;
        if (str.find_last_of(‘b‘)!=-1) d=str.find_last_of(‘b‘);
        stack <char> st; 
        int flag=0,tag=0;
        for (int i=0;i<len;i++) {
           if (st.empty ()) {
               if (str[i]==‘b‘) {
                   flag=1;
                   break;
               }
               else st.push (str[i]);
           }
           else {
              if (str[i]==‘b‘) {
                  st.pop ();
                  if (i==d) {
                      if (!st.empty()) {
                          tag=1;
                          break;
                      }
                  }
              }
              else st.push (str[i]);
           }

        }
        if (flag==1) {
            cout<<"Dead Fang"<<endl;
            continue;
        }
        else if (tag) {
            cout<<"Sad Fang"<<endl;
        }
        else cout<<"Happy Fang"<<endl;
    }


    return 0;
}





以上是关于EOJ Monthly 2020.7 A. 打字机的主要内容,如果未能解决你的问题,请参考以下文章

EOJ Monthly 2020.7 Sponsored by TuSimple E.因数串 数学/ 构造

EOJ Monthly 2020.3 A.迷宫 (二分+最大流)

矩阵快速幂EOJ EOJ Monthly 2021.9 Sponsored by TuSimple A. Amazing Discovery

矩阵快速幂EOJ EOJ Monthly 2021.9 Sponsored by TuSimple A. Amazing Discovery

矩阵快速幂EOJ EOJ Monthly 2021.9 Sponsored by TuSimple A. Amazing Discovery

EOJ Monthly 2018.2