EOJ Monthly 2020.7 Sponsored by TuSimple A 打字机 - 栈-括号匹配

https://acm.ecnu.edu.cn/contest/292/problem/A/

利用栈类似括号匹配
末尾的a一定是操作1形成的,所以可以先将串末尾的连续的a去掉
不可能出现b开头的串
用操作2生成的串a和b是匹配的
可以利用栈进行匹配
如果一个b前面有多个a 那这个时候就有两种可能 即不快乐

遇到a就压栈,遇到b就弹一个出来
最后栈里面还有a就是不快乐
如果遇到一个b这个时候栈是空的 那就是非法的 Dead Fang

#include 
#include 
#include 
#include 
#include 

using namespace std;

#define debug(x) cout<<#x<<": "<<(x)<

int main()
{
    int T;
    cin>>T;
    for(int t=0;t<T;t++){
        string s;
        cin>>s;
        stack<char> st;
        if(s[0]=='b'){
            cout<<"Dead Fang"<<endl;
            continue;
        }

        int pos =s.size()-1;
        for(int i=s.size()-1;i>=0;i--){
            if(s[i]=='a'){
                pos --;
            }else{
                break;
            }
        }

        s = s.substr(0,pos+1);

        bool isS = false;
        for(int i = 0;i < s.size();i++){
            if(s[i]=='a'){
                st.push('a');
            }else if(s[i]=='b'){
                if(st.empty()){
                   cout<<"Dead Fang"<<endl;
                   isS = true;
                   break;
                }
                st.pop();
            }
        }
        if(!isS){
            if(!st.empty()){
                cout<<"Sad Fang"<<endl;
            }else{
                cout<<"Happy Fang"<<endl;
            }
        }
    }
    return 0;
}

EOJ Monthly 2020.7 Sponsored by TuSimple A 打字机 - 栈-括号匹配_第1张图片

你可能感兴趣的:(#,other)