1. 程式人生 > 實用技巧 >EOJ Monthly 2020.7 A. 打字機

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;
}