题意
李华和张红正在玩字符串消除游戏。
游戏规则如下:
- 给定一个由小写字母构成的字符串\(s\)。
- 两人轮流进行消除操作,当轮到一人时,其任务是在当前\(s\)中找到两个连续且相同的字母,并将它们从\(s\)中消除。例如,当\(s\)为
abba
时,可以消除bb
,使\(s\)变为aa
。 - 第一个无法进行消除操作的选手视为失败。
已知,游戏由李华执先手,且两人都采取最优策略。请问,李华是否可以获胜。
题目链接: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;
}