题意:有两个人玩游戏,游戏规则如下:有一个长度为n的字符串,这个字符串由 . 和 X 构成,Alice可以选择a个连续的 . 把它们变成X, Bob可以选择连续的b个 . 把它们变成X。题目中保证a > b, Alice先手,问双方都不放水的情况下谁会赢?

思路:注意到a > b这个关键条件,这个条件是本题的突破口。因为a > b, 我们可以把由 . 构成的区间分成四类:1:长度小于b的区间,这种区间谁都无法填充,不用考虑。2:长度大于等于b小于a的区间,这种区间只有b可以填充。3:长度大于等于a小于2 * b的区间。这种区间双方都可以填充,但是这种区间无法变成类型2的区间。4:长度大于等于2 * b的区间。这种区间可以一步变出类型2的区间。首先我们发现,如果存在类型2的区间,Alice一定赢不了,因为Bob才能填充这个区间。并且,如果类型4的区间大于1个,Alice也必输,因为Bob只需选择类型4区间中的一个,变出一个类型2的区间,Bob就必胜了。那么还剩下2种情况:1:没有类型4的区间。这种情况胜负就和类型3的区间数目相关了。2:只有一个类型4的区间,这时Alice还有可能补救一下。我们只需枚举Alice怎么填充,然后判断这样填充是否能必胜即可。

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 300010;
char s[maxn];
int cnt[5], a, b;
int get(int len) {
if(len < b) return 1;
else if(len >= b && len < a) return 2;
else if(len >= a && len < 2 * b) return 3;
else if(len >= 2 * b) return 4;
return 0;
}
int main() {
int T, re;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &a, &b);
scanf("%s", s + 1);
memset(cnt, 0, sizeof(cnt));
int n = strlen(s + 1);
int len = 0;
for (int i = 1; i <= n; i++) {
if(s[i] == '.') len++;
else {
cnt[get(len)]++;
if(get(len) == 4) {
re = len;
}
len = 0;
}
}
cnt[get(len)]++;
if(get(len) == 4) {
re = len;
}
if(cnt[2] > 0) {
printf("No\n");
continue;
}
if(cnt[4] > 1) {
printf("No\n");
continue;
}
if(cnt[4] == 1) {
bool flag = 0;
for (int i = 0; i <= re - a; i++) {
int len1 = i, len2 = re - (i + a), tmp = 0;
if(get(len1) == 2 || get(len1) == 4 || get(len2) == 2 || get(len2) == 4) continue;
if(get(len1) == 3) tmp++;
if(get(len2) == 3) tmp++;
if((cnt[3] + tmp) % 2 == 0) {
printf("Yes\n");
flag = 1;
break;
}
}
if(flag == 0) {
printf("No\n");
}
} else {
if(cnt[3] % 2 == 1) {
printf("Yes\n");
} else {
printf("No\n");
}
}
}
}

  

最新文章

  1. 深入理解javascript选择器API系列第三篇——h5新增的3种selector方法
  2. 在WPF中使用CefSharp嵌入浏览器
  3. POJ 1990 MooFest(树状数组)
  4. js验证电话号码的正则表达式
  5. MySQL Connector_J_5.1.34_2014.10
  6. 常用PHP运行环境一键安装包
  7. ViewPager + Fragment 实现类微信界面
  8. Swift - 使用UIDatePicker实现倒计时功能
  9. Android发展简报
  10. php中常用的字符串截取函数mb_substr实例解释
  11. jquery 引号问题
  12. Dynamics 365使用代码发送邮件给指定邮箱地址
  13. Maven的基本概念
  14. idea+maven+springboot+mybatis
  15. MySQL5.7更改用户名密码
  16. js事件监听
  17. asp.net 简单记录请求的客户端和服务端 处理时间
  18. MariaDB数据表操作实例
  19. 通过url获取参数信息
  20. 序列化效率比拼——谁是最后的赢家avaScriptSerializer方式、DataContract方式、Newtonsoft.Json

热门文章

  1. [CSP-S模拟测试]:chess(数学)
  2. 用CSS代码编写简易轮播图
  3. WIN7系统JavaEE(java+tomcat7+Eclipse)环境配置
  4. 高通Camera驱动分析【转】
  5. 用Vue来实现音乐播放器(十七):歌手页右侧快速入口实现
  6. jmeter_linux下运行
  7. malloc函数分配内存失败的常见原因
  8. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_01 Collection集合_2_集合框架介绍
  9. list数据的存储
  10. C# datatable 与 xml文件之间的转换