AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 商店
  • 应用
  • 文章
    • 题解
    • 分享
    • 问答
  • 吐槽
  • 登录/注册

AcWing 4504. 字符串消除    原题链接    中等

作者: 作者的头像   66ring ,  2022-08-06 23:15:05 ,  所有人可见 ,  阅读 12


0


#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;
}

0 评论

你确定删除吗?

© 2018-2022 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息