EOJ Monthly 2020.7 Sponsored by TuSimple A. 打字机

EOJ Monthly 2020.7 Sponsored by TuSimple A. 打字机

题目链接
EOJ Monthly 2020.7 Sponsored by TuSimple A. 打字机_第1张图片
感觉题解有些许复杂,我是这样想的:
1.如果只用第一种操作,得到的肯定是一个只包含 a a a 的字符串,此时输出 H a p p y   F a n g Happy\ Fang Happy Fang
2.如果只用第二种操作,我们可以这样想,把 a a a 当作左括号 ( ( (,把 b b b 当作右括号 ) ) ),那么就转化为判断合法的括号序列即可,如果匹配下来还剩 b b b,那么就输出 D e a d   F a n g Dead\ Fang Dead Fang,如果剩下全是 a a a 的话就是题目的难点了:
我们怎么判断此时是 h a p p y happy happy 还是 s a d sad sad 呢,我们容易发现,当发生 a b ab ab 匹配时,如果栈内还有 a a a,则就为 s a d sad sad,但这样判断也不对,比如 a a b b a aabba aabba,此时就输出 h a p p y happy happy,那怎么办呢,我们只需要看最后一次 a b ab ab 匹配时栈内有没有元素即可,AC代码如下:

#include
using namespace std;
typedef long long ll;
int main(){
    int t;
    string s;
    cin>>t;
    while(t--){
        cin>>s;
        stack<char>q;
        int p=0,t=0,u=0;
        for(auto i:s){
            if(i=='b'){
                p=1;
            }
            else t++;
            if(q.empty()) q.push(i);
            else if(q.top()=='a'&&i=='b'){
                q.pop();
                if(q.size()) u=1;//判断最后一次ab匹配栈内有无元素
                else u=0;
            }
            else q.push(i);
        }
        if(!p){//全是a
            printf("Happy Fang\n");
            continue;
        }
        int siz=q.size();
        if(siz==0){//ab完美匹配
            printf("Happy Fang\n");
        }else{
            int flag=0;
            while(!q.empty()){
                char c=q.top();
                if(c=='b'){//栈内只剩b
                    flag=1;
                    printf("Dead Fang\n");
                    break;
                }
                q.pop();
            }
            if(!flag){
                if(u) printf("Sad Fang\n");
                else printf("Happy Fang\n");
            }
        }
    }
    return 0;
}

你可能感兴趣的:(stack,EOJ)