Codeforces 1221E Game With String(string分a,b变换,博弈)
链接:http://codeforces.com/contest/1221/problem/E
题意:给出有.x组成的字符串,两个人博弈,一个人每次可以选择一段连续长度为a的.使得它变成x,另一个选择长度为b的进行操作,为谁会输,保证a>b
题解:

#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+5;
char s[maxn];
int T, n, x, y, a[maxn];
vector<int> v;
int main(){
// freopen("in.txt", "r", stdin);
for(cin>>T; T--; )
{
cin>>x>>y;
cin>>(s+1);
n=strlen(s+1);
for(int i=1; i<=n; i++)
a[i]= s[i]=='.'?1:0;
int cnt=0, ok=0;
v.clear();
for(int i=1; i<=n; i++){
if(a[i]) ++cnt;
else if(cnt) v.push_back(cnt), cnt=0;
}
if(cnt) v.push_back(cnt), cnt=0;
for(auto &val: v){
if(val<x&&val>=y) ok=1;
if(val>=2*y) ++cnt;
}
if(ok || cnt>=2){
cout<<"No"<<"\n"; continue;
}
if(cnt==0){
for(auto &val: v) if(val>=x) ++cnt;
if(cnt&1){
cout<<"Yes"<<"\n"; continue;
}else{
cout<<"No"<<"\n"; continue;
}
}
if(cnt==1){
int max_len=*max_element(v.begin(), v.end());
int flag=0; cnt=0;
for(auto &val: v) if(val!=max_len&&val>=x) ++cnt;
for(int l=1; l+x-1<=max_len; l++)
{
int r=l+x-1;
int left=l-1, right=max_len-r;
if(left>=2*y || right>=2*y) continue;
if((left>=y&&left<x) || (right>=y&&right<x)) continue;
int tmp=cnt+(left>=x)+(right>=x);
if(tmp%2==0){
flag=1; cout<<"Yes"<<"\n"; break;
}
}
if(!flag){
cout<<"No"<<"\n"; continue;
}
}
}
return 0;
}

浙公网安备 33010602011771号