题目大意:
  给你一个只含字符'A'和'B'的串,A和B两人轮流对其中的子串染色,要求被染色的子串中不包含已经被染色的子串。
  最后,如果一方染的'A'少,那么这一方胜;
  如果双方染的'A'和'B'一样多,那么就是平局。
  问哪一方有必胜策略,或是都没有必胜策略。

思路:
  首先可以想到一个贪心的做法:
  当字符串中还有'B'的时候,取一段全'B'子串;
  当字符串中只剩下'A'的时候,不得不取'A',这时候双方轮流取一个。
  显然,当'A'的数量为偶数时,由于双方都轮流取一个'A',最后双方取的'A'一样多,那么一定是平局。
  当'A'的数量为奇数时,显然有一方会多取一个'A',而且一定是先开始取'A'的一方输。
  那么问题就转化成了如果只取'B',最后不能取的一方输(因为只能取'A'了)。
  这就变成了一个经典的Nim游戏模型。
  我们把每一段连续的'B'当作一个子游戏,把'B'的数量当作游戏的状态。
  对于一个状态x,sg(x)=mex{sg(y)|y是x的后继状态}。
  显然,由于题目没有特殊的限制,x的后继状态总是0~x-1的所有状态。
  那么显然sg(x)=x。

 #include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
inline char getupper() {
register char ch;
while(!isupper(ch=getchar()));
return ch;
}
inline int getsg(const int &x) {
return x;
}
int main() {
int n=getint();
int tota=,ans=,cnt=;
for(int i=,ch='\0',last;i<=n;i++) {
last=ch;
ch=getupper();
if(ch=='A') {
tota++;
if(last=='B') {
ans^=getsg(cnt);
cnt=;
}
} else {
cnt++;
}
}
ans^=getsg(cnt);
if(tota&) {
puts(ans?"A":"B");
} else {
puts("-1");
}
return ;
}

[CSAcademy]A-Game的更多相关文章

  1. CSAcademy Beta Round #5 Force Graph

    题目链接:https://csacademy.com/contest/arhiva/#task/force_graph/ 大意是有若干个节点,每个节点对应一个二维坐标,节点之间相互有斥力存在.同时有些 ...

  2. CSAcademy Beta Round #5 Long Journey

    题目链接:https://csacademy.com/contest/arhiva/#task/long_journey/ 大意是有一张无向不带权的图,两个人同时从s点出发,分别前往a点和b点,且每个 ...

  3. CSAcademy Beta Round #4 Swap Pairing

    题目链接:https://csacademy.com/contest/arhiva/#task/swap_pairing/ 大意是给2*n个包含n种数字,每种数字出现恰好2次的数列,每一步操作可以交换 ...

  4. [CSAcademy]Find the Tree

    [CSAcademy]Find the Tree 题目大意: 交互题. 有一棵\(n(n\le2000)\)个结点的树,但是你并不知道树的形态.你可以调用\({\rm query}(x,y,z)\)( ...

  5. [CSAcademy]Sum of Powers

    [CSAcademy]Sum of Powers 题目大意: 给定\(n,m,k(n,m,k\le4096)\).一个无序可重集\(A\)为合法的,当且仅当\(|A|=m\)且\(\sum A_i=n ...

  6. [CSAcademy]Or Problem

    [CSAcademy]Or Problem 题目大意: 一个长度为\(n(n\le2\times10^5)\)的序列\(A(0\le A_i<2^{20})\),将其分为恰好\(m\)个连续段, ...

  7. [CSAcademy]Virus on a Tree

    [CSAcademy]Virus on a Tree 题目大意: 给你一棵\(n(n\le10^5)\)个点的树,一开始点\(1\)有病毒,可以沿着边扩散.你可以事先切掉若干条边,使得病毒扩散不超过\ ...

  8. [CSAcademy]Cycle Tree

    [CSAcademy]Cycle Tree 题目大意: 定义环树是一张无向连通的简单图,它的生成方式如下: \(2\)个点\(1\)条边的图是环树: 对任意一个环树,加入\(k\)个点\(a_{1\s ...

  9. [CSAcademy]Colored Forests

    csacademy description 有\(M\)种颜色编号为\(1-M\).现给树上的每个点染上这\(M\)种颜色中的一种,定义一棵树是\(\mbox{colorful}\)的当且仅当这棵树上 ...

  10. [CSAcademy]Squared Ends

    [CSAcademy]Squared Ends 题目大意: 给你一个长度为\(n(n\le10^4)\)的数列\(\{A_i\}(A_i\le10^6)\).定义区间\(A_{[l,r]}\)的代价为 ...

随机推荐

  1. 【洛谷 P2764】 最小路径覆盖问题(最大流)

    题目链接 首先有\(n\)条路径,每条路径就是一个点,然后尽量合并,答案就是点数-合并数. 套路拆点,源连入,出连汇,原有的边入出连. 最大流就是最大合并数,第一问解决. 然后怎么输出方案? 我是找到 ...

  2. 【leetcode 简单】第十题 实现strStr()

    实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...

  3. 伪ajax操作

    什么是伪Ajax操作? 说白了就是假的ajax操作,但是它和正常的ajax操作的目的是一样的,把前端的信息发送到后台 先看一下代码吧! ajax.html <form action=" ...

  4. windows程序设计.第一个windos程序

    Windows程序设计(第5版) windows程序需要调用API. 第一个Windows程序 /*HelloMsg.c -- Displays "Hello World!" in ...

  5. Android设备相关配置

    http://source.android.com/devices/tech/storage/index.html Android supports devices with external sto ...

  6. VirtualBox与Genymotion命令行启动

    一.VirtualBox命令行启动 1.添加环境变量: %programfiles%\Oracle\VirtualBox 2.用VBoxManage查看已存在vmname|uuid命令: VBoxMa ...

  7. POJ 2349 Arctic Network(最小生成树+求第k大边)

    题目链接:http://poj.org/problem?id=2349 题目大意:有n个前哨,和s个卫星通讯装置,任何两个装了卫星通讯装置的前哨都可以通过卫星进行通信,而不管他们的位置. 否则,只有两 ...

  8. android Webview Html5 相关文章

    Android WebView的使用集锦(支持Html5) http://blog.csdn.net/l_215851356/article/details/69239643 WebView详解与简单 ...

  9. IEEEXtreme 10.0 - N-Palindromes

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - N-Palindromes 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...

  10. Geoffrey Hinton获得IEEE的麦克斯韦奖的颁奖辞

    2016年6月IEEE的麦克斯韦奖颁发给了机器学习的领军人物Geoffrey Hinton.颁奖辞十分优雅,同时简洁.凝练地解释了机器学习的最新进展以及神经网络的崛起.我忍不住翻译了一下. 颁奖辞 G ...