Codeforces1037G A Game on Strings 【SG函数】【区间DP】
题目分析:
一开始没想到SG函数,其它想到了就开始敲,后来发现不对才发现了需要SG函数。
把每个字母单独提出来,可以发现有用的区间只有两个字母之间的区间和一个位置到另一个字母的不跨越另一个相同字母的位置。
对于这些区间,用区间DP处理出来答案,合并答案的时候用SG函数。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn= ; int n,q;
char str[maxn];
int pre[][maxn],suf[][maxn];
int arr[][maxn],ar[][maxn];
int Pf[][maxn],Sf[][maxn]; int solve(int,int,int); int hd(int k,int l,int r,int dep){
if(ar[k][l]) return Sf[k][l];
else {
ar[k][l]=,Sf[k][l] = solve(l,r,dep+);
return Sf[k][l];
}
}
int pd(int k,int r,int l,int dep){
if(arr[k][r]) return Pf[k][r];
else{
arr[k][r] = ,Pf[k][r] = solve(l,r,dep+);
return Pf[k][r];
}
} int app[maxn][];
int solve(int l,int r,int dep){
if(l > r) return ;
if(l == r) return ;
for(int k=;k<=;k++) app[dep][k] = ;
for(int k=;k<;k++){
int pv = suf[k][l],sv = pre[k][r];
if(pv > r || sv < l || pv == - || sv == -) continue;
int ans = Pf[k][sv]^Pf[k][pv];
if(pre[k][r] != r) ans ^= pd(k,r,sv+,dep);
if(suf[k][l] != l) ans ^= hd(k,l,pv-,dep);
app[dep][ans] = ;
}
for(int i=;i<=;i++) if(app[dep][i] == ) return i;
} void init(){
for(int i=;i<n;i++){
if(i->=&&pre[str[i]-'a'][i-]!=-){
int k = str[i]-'a';
if(pre[k][i-]+>i-) Pf[k][i]=Pf[k][pre[k][i-]];
else Pf[k][i]=Pf[k][pre[k][i-]]^Pf[k][i-];
arr[k][i] = ;
}
for(int k=;k<;k++){
if(pre[k][i] == -) continue;
if(arr[k][i]) continue;
if(pre[k][i] != i) Pf[k][i] = solve(pre[k][i]+,i,);
arr[k][i] = ;
}
}
for(int i=n-;i>=;i--){
if(i+<n&&suf[str[i]-'a'][i+]!=-){
int k = str[i]-'a';
if(i+ > suf[k][i+]-) Sf[k][i]=Sf[k][suf[k][i+]];
else Sf[k][i]=Sf[k][suf[k][i+]]^Sf[k][i+];
ar[k][i] = ;
}
for(int k=;k<;k++){
if(suf[k][i] == -) continue;
if(ar[k][i]) continue;
if(suf[k][i] != i) Sf[k][i] = solve(i,suf[k][i]-,);
ar[k][i] = ;
}
}
} void read(){
scanf("%s",str);
scanf("%d",&q);
n = strlen(str);
for(int k=;k<;k++){for(int i=;i<n;i++) pre[k][i] = suf[k][i] = -;}
for(int i=;i<n;i++)pre[str[i]-'a'][i] = i,suf[str[i]-'a'][i] = i;
for(int k=;k<;k++){
for(int i=;i<n;i++) if(pre[k][i]==-) pre[k][i] = pre[k][i-];
for(int i=n-;i>=;i--) if(suf[k][i]==-) suf[k][i] = suf[k][i+];
}
} void work(){
for(int i=;i<=q;i++){
int l,r; scanf("%d%d",&l,&r);
int flag = solve(l-,r-,);
if(flag) puts("Alice");
else puts("Bob");
}
} int main(){
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
read();
init();
work();
return ;
}
Codeforces1037G A Game on Strings 【SG函数】【区间DP】的更多相关文章
- 【BZOJ1413】取石子游戏(博弈,区间DP)
题意:在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从最左或最右的一堆中 ...
- ABC206 F - Interval Game 2 (区间DP,博弈论,SG函数)
题面 题意很简单 A l i c e \tt Alice Alice 和 B o b \tt Bob Bob 在博弈.摆在他们面前有 N \rm N N 个区间 [ l i , r i ) \rm[l ...
- 维护后面的position sg函数概念,离线+线段 bzoj 3339
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1160 Solved: 596[Submit][Status][ ...
- 【博弈论】【SG函数】【线段树】Petrozavodsk Summer Training Camp 2016 Day 9: AtCoder Japanese Problems Selection, Thursday, September 1, 2016 Problem H. Cups and Beans
一开始有n个杯子,每个杯子里有一些豆子,两个人轮流操作,每次只能将一个豆子移动到其所在杯子之前的某个杯子里,不过可以移动到的范围只有一段区间.问你是否先手必胜. 一个杯子里的豆子全都等价的,因为sg函 ...
- P3235-[HNOI2014]江南乐【整除分块,SG函数】
正题 题目链接:https://www.luogu.com.cn/problem/P3235 题目大意 \(T\)组游戏,固定给出\(F\).每组游戏有\(n\)个石头,每次操作的人可以选择一个数量不 ...
- HDU 5795 A Simple Nim 打表求SG函数的规律
A Simple Nim Problem Description Two players take turns picking candies from n heaps,the player wh ...
- 【转】博弈—SG函数
转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ...
- HDU 1848 Fibonacci again and again【SG函数】
对于Nim博弈,任何奇异局势(a,b,c)都有a^b^c=0. 延伸: 任何奇异局势(a1, a2,… an)都满足 a1^a2^…^an=0 首先定义mex(minimal excludant)运算 ...
- POJ2425 A Chess Game[博弈论 SG函数]
A Chess Game Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 3917 Accepted: 1596 Desc ...
随机推荐
- 小L的试卷
题目描述 小L期末考试结束,高高兴兴放假回家了,可是那么多试卷,老师还要加班批改,有n份试卷由k个老师批改,n份试卷进行了密封编号,由于试卷上的做题情况和书写的规范程序不一样,批改不同的试卷用时也可能 ...
- 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题
Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...
- Navicat还原出现Finished - Stopped before completion的问题
查看数据库中最大的单个文件容量 SHOW VARIABLES LIKE '%max_allowed_packet%'; 设置最大单个文件容量为10M,单次有效(新建查询---运行) SET GLO ...
- [2017BUAA软工助教]团队开发阶段CheckList
alpha阶段流程与相关节点 以下流程与团队项目中个人的得分点是一一对应的,详见QA文档中"个人在团队项目的得分部分" http://www.cnblogs.com/Childis ...
- sqlserver笔记
表结构: 一,字段类型sqlserver jdbc java char char Stringnchar nchar Stringvarchar varchar Stringnvarchar nvar ...
- 自己实现数据结构系列四---Queue
一.代码部分 1.定义接口: public interface Queue<E> { void enqueue(E e); E dequeue(); E getFront(); int g ...
- 【kindle笔记】读书记录-总
注:谨以此贴记录各种读书心得的目录.包括纸质书和电子书等等. 我的啃豆 说起来,买啃豆的初心是<鸟哥私房菜> 来自亚马逊中国官网,于公元2017年,在双十一与双十二中间,一千大洋购得 有了 ...
- JUnit的配置及使用
一.安装插件JUnitGenertor V2.0 File->Setting->Plugins->在搜索框里输入JUintGenerator V2.0 二.导入JUnit相关jar包 ...
- tomcat启动参数
/usr/java/jdk1..0_191-amd64/bin/java -Djava.util.logging.config./conf/logging.properties -Djava.util ...
- centos ping www.baidu.com ping: unknown host www.baidu.com
[root@zabbix ~]# cat /etc/resolv.conf ; generated by /sbin/dhclient-script nameserver 219.141.136.10