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