AcWing 4504. 字符串消除
原题链接
中等
作者:
66ring
,
2022-08-06 23:15:05
,
所有人可见
,
阅读 12
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 1. 任意次序取相邻做消除, 最后结果是一样的
// 2. 统计消除操作的数目, 偶数先手必输
// 利用栈, 一出现成对就删除, 一出现成对就删除
// 证明1
// 数学归纳: 设对于所有长度 < n的序列都成立
// n = 1是显然成立
// 证n时也成立
//
// 存在多组相邻字串, 可选操作: 删xx, 删yy等。任意选择结果是一样的
// 若先删xx, 之后长度为n-2, 根据归纳假设长度小于n时, 任意操作, 结果唯一
// 若先删yy, 之后长度为n-2, 根据归纳假设长度小于n时, 任意操作, 结果唯一
//
// 现要证明先删xx的方案和先删yy的方案是一样的
// 1. 根据归纳假设,
// 先删除xx的一系列方案是相同的。先删除yy的一系列方案是相同的
// 2. 所以只要先删除xx系列中存在一个方案和先删yy系列中一个相同,
// 那先删哪个都相同
//
// 先删xx之后某步必要删除yy(最优策略, 不可能白给), 存在以下情况
// yy本身就相连, 那删yy, 删xx一人一个, 结果不影响
int main() {
string s;
string stk;
cin >> s;
int ans = 0;
for (auto &c : s) {
if (stk.back() == c) {
ans++;
stk.pop_back();
} else {
stk.push_back(c);
}
}
if (ans % 2 == 0)
cout << "No";
else
cout << "Yes";
return 0;
}