original link - http://codeforces.com/contest/1221/problem/E
题意:
给出一个 串,两个人做游戏,第一个人一次要填 个连续的 ,第二个人 个连续的 。
谁不能填就输了,问第一个人的输赢。保证 。
解析:
有点难想,有点意思。
我们考虑如果第二个人手上有一段 的 ,那么显然第二个人就赢了。(如果有其他的,就填其他的,如果没有我才用这段,而因为 所以之后第一个人也没有地方可以填了)
第二个可以通过一段长度大于等于 的段去造出 ,所以第一个人要在第一次填完后不能存在长度大于大于 的段。
如果有两段大于等于 的话,百分百不行;如果只有一段,我们可以去枚举填每个位置下的情况;如果没有,就看看剩下的两个人都可以填的段的数量的奇偶性。
代码:
/*
* Author : Jk_Chen
* Date : 2019-09-23-16.13.54
*/
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define rep(i,a,b) for(int i=(int)(a);i<=(int)(b);i++)
#define per(i,a,b) for(int i=(int)(a);i>=(int)(b);i--)
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pill pair<int, int>
#define fi first
#define se second
#define debug(x) cerr<<#x<<" = "<<x<<'\n';
const LL mod=1e9+7;
const int maxn=3e5+9;
const int inf=0x3f3f3f3f;
LL rd(){ LL ans=0; char last=' ',ch=getchar();
while(!(ch>='0' && ch<='9'))last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans; return ans;
}
/*_________________________________________________________begin*/
char x[maxn];
int main(){
int t=rd();
while(t--){
int a=rd(),b=rd();
int cant=0;
gets(x+1);
int len=strlen(x+1);
int tmp=0;
int num=-1;
int ct=0;
rep(i,1,len+1){
if(x[i]=='X'||x[i]=='\0'){
if(tmp<b);
else if(tmp>=b&&tmp<a){
cant=1;break;
}
else if(tmp>=2*b){
if(num==-1)num=tmp;
else {cant=1;break;}
}
else{
ct++;
}
tmp=0;
}
else tmp++;
}
if(cant){printf("NO\n");continue;}
if(num!=-1){
int can=0;
rep(i,0,num-a){
int j=num-a-i;
if(i>=2*b||j>=2*b)continue;
if(i>=b&&i<a)continue;
if(j>=b&&j<a)continue;
int now=ct;
if(i>=b)now++;
if(j>=b)now++;
if(now%2==0)can=1;
}
if(can)printf("YES\n");
else printf("NO\n");
}
else{
if(ct%2)printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
转载:https://blog.csdn.net/jk_chen_acmer/article/details/101223595
查看评论