https://codeforces.com/problemset/problem/1221/E
如果轮到b拿的时候有b<=len<a的情况,那么此时b必胜,因为他总是可以拿下次A要拿的那个,当下次A拿不到了,它就拿这个。
如果轮到b拿的时候有2*b<=len的情况,它可以做一个出来,那么还是b必胜。
所以A先手需要防止有以上两种情况的出现,也就是如果只存在1个2*b<=len的情况,我们要枚举a断开的情况,也就是尝试一下有没有补救的机会,有1个b<=len<a和大于等于2个2*b<=len,都完了。
然后如果只剩a<=len<2b的段时,就判断奇偶性
#include<bits/stdc++.h>
#define maxl 300010
using namespace std;
int a,b,n,ans,cnt1,cnt2,cnt3,len3;
char s[maxl];
inline void ins(int cnt)
{
if(b<=cnt && cnt<a)
cnt1++;
if(a<=cnt && cnt<2*b)
cnt2++;
if(2*b<=cnt)
{
cnt3++;
if(!len3)
len3=cnt;
}
}
inline void prework()
{
scanf("%d%d",&a,&b);
scanf("%s",s+1);
n=strlen(s+1);len3=0;
int cnt=0;cnt1=cnt2=cnt3=0;
for(int i=1;i<=n;i++)
if(s[i]=='.')
cnt++;
else
ins(cnt),cnt=0;
ins(cnt);cnt=0;
}
inline void mainwork()
{
if(cnt3==0 && cnt1==0)
{
if(cnt2&1)
ans=1;
else
ans=0;
return;
}
if(cnt3==1)
{
ans=0;
int len1,len2,t1=cnt1,t2=cnt2,t3=cnt3;
for(int i=0;i<=len3-a;i++)
{
cnt1=t1;cnt2=t2;cnt3=t3;
len1=i,len2=len3-i-a;
cnt3--;
ins(len1),ins(len2);
if(cnt3==0 && cnt1==0)
{
if(!(cnt2&1))
ans=1;
}
}
return;
}
ans=0;
}
inline void print()
{
if(ans)
puts("YES");
else
puts("NO");
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}