CF1527 B2. Palindrome Game (hard version)

https://codeforces.com/contest/1527/problem/B2

 

题意:

把easy version的初始的01串是回文串的条件去掉

 

easy version:

https://www.cnblogs.com/TheRoadToTheGold/p/15254083.html

 

在easy version的基础上考虑hard version

如果串是回文串,就按easy version做

如果不是,那么先手就可以执行翻转操作,逼迫后手执行操作1

根据easy version得出,当一个人面临偶数个0且串是回文串时,对方一定有策略使接下来的操作自己会比对方多执行2次操作1

所以先手一直执行翻转操作,直到还差一步s就会变成有偶数个0的回文串,此时先手执行操作1,使s变成有偶数个0的回文串

这时先手执行了1次操作1,后手至少执行了1次操作1,接下来后手会比先手多执行2次操作1

所以先手必胜

需要特别判断非回文串中0的个数<=2的串

发现只有2个0,且有一个0在中间的时候,平局

#include<bits/stdc++.h>
 
char s[1003];

bool check(int n)
{
    int m=n/2;
    for(int i=1;i<=m;++i)
        if(s[i]!=s[n-i+1]) return false;
    return true;
}
 
int main()
{
    int T,n,m;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        scanf("%s",s+1);
        m=0;
        for(int i=1;i<=n;++i)
            if(s[i]=='0') ++m;
        if(check(n))
        { 
            if(!(m%2)) printf("BOB\n");
            else 
            {
                if(m==1) printf("BOB\n");
                else printf("ALICE\n");
            }
        }
        else
        {
            if(m==2 && (n&1) && s[n+1>>1]=='0') printf("DRAW\n");
            else printf("ALICE\n");
        }
    }
}

 

posted @ 2021-09-11 11:09  TRTTG  阅读(102)  评论(0编辑  收藏  举报