题目

递归定义括号序列

  • 空串是括号序列
  • (A)是一个括号序列,其中A为括号序列
  • AB是一个括号序列,其中A,B均为括号序列

    定义严格括号序列为形如(A)的括号序列,其中A为括号序列。

给出一个长度为\(n(n\le 10^3)\)的合法括号序列,两个人进行游戏,每次一个人取走一个严格括号序列,不能再取的算输,问先手必胜还是后手必胜。

分析

好题。严格括号序列可以看成一棵树。一个严格括号序列的每个左括号表示一个点深搜进入,右括号表示遍历完所有的子树了。一个不严格的括号序列可以看成一堆树,就是一个森林。这个游戏完全等价于在一个森林中轮流删除一个点及其子树。这是一个经典问题。

Green Hackenbush Game

砍树游戏是指,在一个有根树组成的森林中,两个玩家轮流砍掉树上的一条边,那条边连出去的子树都被砍掉。无法操作者输。

如何考察这个问题?首先考虑最简单的形式,所有的有根树都是一条,那么这个问题就完全等价于一个Nim游戏,因为每一次都是在一棵树上的\(n\)个点中删去\(a\in [1,n]\)个点,相当于在许多堆石子中每次选一堆,取出任意多个。从SG函数的角度看,对于一条链,它的SG值其实就是链的长度。

接下来考虑如何把一颗分叉的树转化为链的形式。

Colon Principle

对于树上的一个分叉的节点,所有的分叉都是一条链,那么可以把这些分叉换成一条长度为它们异或和的链,新树与原树在游戏中等价。

有了这个性质,我们只要自下而上把所有的分叉换成链,到最后整棵树形成一条链,我们就得到整棵树的SG值了。

下面我们来证明这个性质。

有两颗随机的树\(H_1,H_2\),满足它们的SG函数值是相同的。现在有一棵树\(G\)和上面一个定点\(x\),用\(G_1\)表示把\(H_1\)接在\(G\)的\(x\)点上形成的树,\(G_2\)表示把\(H_2\)接在\(G\)的\(x\)点上形成的树。我们现在要证明的就是,这两棵树根节点的SG函数值是相同的。这其实就是在证明两棵树的根节点的SG值异或为0。由于多个子游戏拼成的大游戏的SG值就是每个子游戏的SG值异或起来,所以这个证明等价于把这两棵树放在一起做游戏,规则是每次砍掉任意一棵树的任意一条边,后手必胜。一种显然的后手必胜方法就是,对于不涉及到\(H\)内部的操作,后手模仿先手的操作,因为两棵树除了\(H\)的部分是完全一样的。对于涉及到\(H\)内部的操作,即只涉及子树内的操作,我们可以看成是\(H_1\)和\(H_2\)单独做游戏。由于\(H_1\)和\(H_2\)的SG函数值是一样的,所以这两颗树的单独游戏也是后手必胜的。这样整个游戏就是后手必胜的了,故结论成立。

非常巧妙的构造和证明!

代码

#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=1e3+1;
char s[maxn];
int sta[maxn],top,n,tim=0,ck[maxn];
struct edge {
int v,nxt;
} e[maxn<<1];
int h[maxn],tot=0,ans,f[maxn],all;
void add(int u,int v) {
if (ck[u]!=tim) ck[u]=tim,h[u]=0;
e[++tot]=(edge){v,h[u]};
h[u]=tot;
}
void dfs(int x) {
f[x]=0;
if (ck[x]!=tim) h[x]=0;
for (int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) dfs(v),f[x]^=f[v];
++f[x];
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
int T=read();
while (T--) {
scanf("%s",s+1);
n=strlen(s+1);
top=ans=0;
for (int i=1;i<=n;++i) {
if (!top) {
++tim,tot=all=0;
sta[++top]=++all;
continue;
}
if (s[i]=='(') {
int u=sta[top];
sta[++top]=++all;
add(u,all);
} else --top;
if (!top) {
dfs(1);
ans^=f[1];
}
}
puts(ans?"peipei":"iamcs");
}
return 0;
}

xsy1436-括号游戏的更多相关文章

  1. “数学口袋精灵”App的第三个Sprint计划(总结与团队感悟)----开发日记

    第三阶段Sprint完成情况: 我们的"数学口袋精灵"App已经完成了,该app能随机产生多种形式的算式,比如带括号的,分数四则运算,混合运算,阶乘等,通过游戏形式让用户乐在其中. ...

  2. 【洛谷4424】[HNOI_AHOI2018]寻宝游戏(我也不知道括号里该写啥)

    题目 洛谷 4424 分析 感觉思路比较神仙. 对于按位与和按位或两种运算,显然每一位是独立的,可以分开考虑. 对于某一位,「与 \(0\)」会将这一位变成 \(0\),「或 \(1\)」会将这一位变 ...

  3. leetcode32 最长游戏括号 dp

    有一说一,我觉得这题没有到困难级 要保存之前的状态,感觉是很明显的dp 思路和题解一样 class Solution { public: int longestValidParentheses(str ...

  4. 分享:使用 TypeScript 编写的 JavaScript 游戏代码

    <上篇博客>我写出了我一直期望的 JavaScript 大型程序的开发模式,以及 TS(TypeScript) 的一些优势.博客完成之后,我又花了一天时间试用 TS,用它来重构之前编写的一 ...

  5. 【趣味分享】C#实现回味童年的24点算法游戏

    一.24点游戏玩法规则效果展示 1.初始化界面 2.开始游戏界面 3.游戏超时界面 4.查看答案界面 5.答对界面 6.答错界面 7.计算表达式的验证界面 8.一副牌算完开始新一副牌界面 到这里24点 ...

  6. [BZOJ3729]Gty的游戏

    [BZOJ3729]Gty的游戏 试题描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动 ...

  7. 【游戏开发】小白学Lua(上)

    在很多游戏中,脚本语言是不可或缺的一部分,很多游戏都使用到了Lua,js,python一类的脚本,脚本语言可以在很多方面给开发进程带来帮助.脚本语言可以作为初始化文件读入变量和游戏数据的一个快速而方便 ...

  8. [体感游戏] 1、MPU6050数据采集传输与可视化

    最近在研究体感游戏,到目前为止实现了基于51单片机的MPU6050数据采集.利用蓝牙模块将数据传输到上位机,并利用C#自制串口数据高速采集软件,并且将数据通过自制的折线图绘制模块可视化地展示出来等功能 ...

  9. iOS和android游戏纹理优化和内存优化(cocos2d-x)(转载)

    转自http://blog.csdn.net/langresser_king/article/details/8426708 (未完成) 1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x ...

  10. 转 iOS和android游戏纹理优化和内存优化(cocos2d-x)

    iOS和android游戏纹理优化和内存优化(cocos2d-x) (未完成) 1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x不同平台读取纹理的机制不同.ios下面使用CGImage, ...

随机推荐

  1. 【8086汇编-Day6】关于loop的实验

    实验内容 因为是要复制代码,所以常规来做是取代码段地址来用,所以把cs值mov给ax,但是这只是临时的,ax之后还有别的用途,那就把指令当作数据来存(把ax值 mov给ds,表示这一段地址用作代码段, ...

  2. 北京Uber优步司机奖励政策(11月9日~11月15日)

    用户组:人民优步“关羽组”(适用于11月9日-11月15日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月 ...

  3. 成都Uber优步司机奖励政策(1月8日)

    1月8日 奖励政策 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblog ...

  4. DATA 转 16 进制

    // 转 16进制 编码 NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMo ...

  5. COGS:1822. [AHOI2013]作业

    1822. [AHOI 2013] 作业 ★★★   输入文件:ahoi2013_homework.in   输出文件:ahoi2013_homework.out   简单对比时间限制:20 s   ...

  6. plsql解决中文乱码

    进入 我的电脑,属性,高级,环境变量,添加2项: 1.LANG=zh_CN.GBK 2.NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

  7. Java连接redis集群操作存储、删除以及获取值

    pom文件添加: <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> &l ...

  8. 安装MySQLdb模块遭遇"fatal error: my_config.h: No such file or directory"的处理

    Issue       I encountered an error when I run the python script which need to import the module of & ...

  9. java 素数问题

    1.素数 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 2.java 实现 一般都要用不能被自己和其他数字整除判断,jdk中已经有更好的实现方法了. List<BigInte ...

  10. python3基础盲点

    数值类型 Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点数)complex (复数) python3对整数的大小不做限制 算数运算符 优先级: 逻辑运算符 优 ...