字符串消除(栈)

题意

李华和张红正在玩字符串消除游戏。

游戏规则如下:

  1. 给定一个由小写字母构成的字符串\(s\)
  2. 两人轮流进行消除操作,当轮到一人时,其任务是在当前\(s\)中找到两个连续且相同的字母,并将它们从\(s\)中消除。例如,当\(s\)abba时,可以消除bb,使\(s\)变为aa
  3. 第一个无法进行消除操作的选手视为失败。

已知,游戏由李华执先手,且两人都采取最优策略。请问,李华是否可以获胜。

题目链接:https://www.acwing.com/problem/content/4507/

数据范围

\(1 \leq |s| \leq 10^5\)

思路

这道题非常经典,但是我一时没有想到。

使用栈进行模拟即可。

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <stack>

using namespace std;

const int N = 100010;

int n;
char s[N];
stack<char> stk;

int main()
{
    scanf("%s", s + 1);
    n = strlen(s + 1);
    int ans = 0;
    for(int i = 1; i <= n; i ++) {
        if(!stk.size()) {
            stk.push(s[i]);
            continue;
        }
        char c = stk.top();
        if(c == s[i]) {
            ans ++;
            stk.pop();
        }
        else stk.push(s[i]);
    }
    if(ans % 2 == 0) printf("No\n");
    else printf("Yes\n");
    return 0;
}
posted @ 2022-08-07 11:00  pbc的成长之路  阅读(34)  评论(0编辑  收藏  举报