题目大意

两个人轮流在一个字符串上删掉一个字符,没有字符可删的人输掉游戏

删字符的规则如下:

  1. 每次从一个字符串中选取一个字符,它是一个长度至少为 3 的奇回文串的中心

  2. 删掉该字符,同时,他选择的那个字符串分成了两个独立的字符串

现在问,先手是否必胜,如果先手必胜,输出第一步应该删掉第几个字符,有多解的话,输出序号最小的那个

字符串的长度不超过5000,只包含小写英文字母

做法分析

可以这样考虑:将所有的长度大于等于 3(其实只需要找长度为 3 的就行)的奇回文串的中心标记出来

我们将连续的中心视为一个片段,那么,显然,游戏是进行在片段上面的,所以,游戏被分解成了多个子游戏的和

对于每一个片段(子游戏),我们考虑它的 sg 函数,显然,sg 函数只和这个片段的长度有关,于是定义状态 sg[len] 表示长度为 len 的片段的 sg 值。怎么得到当前状态的下一子状态呢?

  如果删掉的是片段的两端,子状态分成了一个长度为 0 和长度为 len-2 的子片段

  如果删掉的是片段的中间,子状态分成了一个长度为 i 和长度为 len-3-i 的子片段

这样,暴力出 sg 值,再依次的枚举第一次删掉的字符就可以解决这题了

参考代码

 #include <iostream>
#include <cstring>
#include <cstdio> using namespace std; const int N=; char buff[N];
int sg[N]; int GET_SG(int len) {
if(sg[len]!=-) return sg[len];
bool vs[N];
memset(vs, , sizeof vs);
vs[GET_SG(len-)]=;
for(int i=; i+i<len; i++) vs[GET_SG(i-)^(GET_SG(len--i))]=;
for(int i=; i<N; i++) if(!vs[i]) return sg[len]=i;
} int hehe(int L, int R) {
int sum=;
for(int i=L+; i<R; i++) if(buff[i-]==buff[i+]) {
int id=i;
while(i<R && buff[i+]==buff[i-]) i++;
sum^=sg[i-id];
}
return sum;
} int main() {
memset(sg, -, sizeof sg);
sg[]=, sg[]=;
for(int i=; i<N; i++) if(sg[i]==-) GET_SG(i);
while(scanf("%s", buff)!=EOF) {
bool flag=;
for(int i=, len=(int)strlen(buff); i<len-; i++) {
if(buff[i-]!=buff[i+]) continue;
if(hehe(, i-)^hehe(i+, len-)) continue;
printf("First\n%d\n", i+);
flag=;
break;
}
if(flag) printf("Second\n");
}
return ;
}

E. Playing with String

题目链接 & AC 通道

Codeforces Round #184 (Div. 2) E. Playing with String

Codeforces Round #184 (Div. 2) E. Playing with String(博弈)的更多相关文章

  1. Codeforces Round #297 (Div. 2)B. Pasha and String 前缀和

    Codeforces Round #297 (Div. 2)B. Pasha and String Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: xxx ...

  2. 字符串处理 Codeforces Round #297 (Div. 2) B. Pasha and String

    题目传送门 /* 题意:给出m个位置,每次把[p,len-p+1]内的字符子串反转,输出最后的结果 字符串处理:朴素的方法超时,想到结果要么是反转要么没有反转,所以记录 每个转换的次数,把每次要反转的 ...

  3. Codeforces Round #184 (Div. 2)

    A. Strange Addition (目前的做法好像做烦了) 统计数的\(mask\),表示个.十.百位上是否是0,共8种数. 枚举8种数组成的所有情况\(2^8\),记录最大数量. B. Con ...

  4. Codeforces Round #877 (Div. 2) B. - Nikita and string

    题目链接:http://codeforces.com/contest/877/problem/B Nikita and string time limit per test2 seconds memo ...

  5. Codeforces Round #522 (Div. 2) C. Playing Piano

    C. Playing Piano 题目链接:https://codeforces.com/contest/1079/problem/C 题意: 给出数列{an},现在要求你给出一个数列{bn},满足: ...

  6. Codeforces Round #296 (Div. 2) A. Playing with Paper

    A. Playing with Paper One day Vasya was sitting on a not so interesting Maths lesson and making an o ...

  7. 水题 Codeforces Round #296 (Div. 2) A. Playing with Paper

    题目传送门 /* 水题 a或b成倍的减 */ #include <cstdio> #include <iostream> #include <algorithm> ...

  8. Codeforces Round #354 (Div. 2) C. Vasya and String

    题目链接: http://codeforces.com/contest/676/problem/C 题解: 把连续的一段压缩成一个数,对新的数组求前缀和,用两个指针从左到右线性扫一遍. 一段值改变一部 ...

  9. Codeforces Round #354 (Div. 2) C. Vasya and String 二分

    C. Vasya and String 题目连接: http://www.codeforces.com/contest/676/problem/C Description High school st ...

随机推荐

  1. 【原】关于使用jieba分词+PyInstaller进行打包时出现的一些问题的解决方法

    错误现象: 最近在做一个小项目,在Python中使用了jieba分词,感觉非常简洁方便.在Python端进行调试的时候没有任何问题,使用PyInstaller打包成exe文件后,就会报错: 错误原因分 ...

  2. crossplatform---Nodejs in Visual Studio Code 10.IISNode

    1.开始 Nodejs in Visual Studio Code 08.IIS : http://www.cnblogs.com/mengkzhaoyun/p/5410185.html 参考此篇内容 ...

  3. python web框架——初识tornado

    一 Tornado概述 Tornado是FriendFeed使用的可扩展的非阻塞式web框架及其相关工具的开源版本.这个Web框架看起来有些像web.py或者Google的 webapp,不过为了能有 ...

  4. python BeautifulSoup实例测验

  5. 通过MSSQL连接服务器连接至Oracle数据库

    前言 有很多时候,我们需要MSSQL与Oracle进行跨库查询或数据交互.本篇随笔将阐述如何通过MSSQL的连接服务器连接至Oracle数据库,并且读取数据的示例. 具体步骤 首先需要到Oracle的 ...

  6. 《Xenogears》(异度装甲)隐含的原型与密码

    <Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...

  7. 使用 Aircrack-ng 破解 WEP 和 WPA/WPA2 加密的 Wi-Fi 密码。(转)

    1.首先请不要使用此方法去搞破坏,去蹭Wi-Fi,因为不装逼地说,我认为技术本身的价值很大,尤其是在学习这个技术的过程中解决遇到的问题,当经过重重困难最后终于成功之后的喜悦又怎么能拿去蹭网呢.我在此过 ...

  8. wmi详解,RPC和防火墙

    135端口:Microsoft在这个端口运行DCE RPC end-point mapper为它的DCOM服务.这与UNIX 111端口的功能很相似.使用DCOM和RPC的服务利用计算机上的end-p ...

  9. MySQL执行计划中key_len详解

    (1).索引字段的附加信息:可以分为变长和定长数据类型讨论,当索引字段为定长数据类型,比如char,int,datetime,需要有是否为空的标记,这个标记需要占用1个字节:对于变长数据类型,比如:v ...

  10. 10个有关RESTful API良好设计的最佳实践

    Web API已经在最近几年变成重要的话题,一个干净的API设计对于后端系统是非常重要的. 通常我们为Web API使用RESTful设计,REST概念分离了API结构和逻辑资源,通过Http方法GE ...