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"); } } }