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 ...
随机推荐
- Integer的NPE问题
- [转帖]一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS https://home.cnblogs.com/u/beyang/ 一台服务器,两个域名 首先购买https,获取到CA证 ...
- [转帖]整理:Windows系统下的奇技淫巧大汇总
整理:Windows系统下的奇技淫巧大汇总 https://blog.csdn.net/bat67/article/details/76381357 Win+home Crtl+home 还有 Win ...
- Button按钮为什么无缘无故会提交form表单?
我的form表单里有好几个Button按钮,每个按钮有不同的功能,可是这些按钮居然都有提交功能,真是把我惊呆了 <button class="btn btn-info " o ...
- Day 5-6 反射和内置方法之item系列
python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) #!_*_ coding:utf-8 _*_ class People: def ...
- Day5-1 面向对象和面向过程
摘要: 类的定义 类的增删改查 对象的增删改查 对象的查找和绑定 面向对象和面向过程的区别: 1.面向过程就像是工厂的流水线,按部就班的有序的工作. 优点:把复杂的问题简单化 缺点:可扩展性差.一个步 ...
- npm install、npm install --save、npm install --save --dev、npm install -S、npm install -D的区别
npm install X: 会把X包安装到node_modules目录中 不会修改package.json 之后运行npm install命令时,不会自动安装X npm install X –sav ...
- python爬虫之爬虫性能篇
一.首先想到的是for循环,单线程爬取每个url,但是如果有url出现了问题,后面的url就得等,性能低. 二.我们考虑线程池的问题,下面我们定义了线程池里面最多10个任务,也就是说最多同一时间只能有 ...
- CentOS7装Tomcat
有两种安装方式:(1)yum 命令 (2)安装包 本次采用第二种方式: 1.windos下载apache-tomcat-7.0.73.tar.gz安装包 2.通过WinSCP传到linux下(本次放 ...
- python之路--关于线程的一些方法
一 . 线程的两种创建方式 from threading import Thread # 第一种创建方式 def f1(n): print('%s号线程任务'%n) def f2(n): print( ...