题目分析:

一开始没想到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】的更多相关文章

  1. 【BZOJ1413】取石子游戏(博弈,区间DP)

    题意:在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从最左或最右的一堆中 ...

  2. 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 ...

  3. 维护后面的position sg函数概念,离线+线段 bzoj 3339

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1160  Solved: 596[Submit][Status][ ...

  4. 【博弈论】【SG函数】【线段树】Petrozavodsk Summer Training Camp 2016 Day 9: AtCoder Japanese Problems Selection, Thursday, September 1, 2016 Problem H. Cups and Beans

    一开始有n个杯子,每个杯子里有一些豆子,两个人轮流操作,每次只能将一个豆子移动到其所在杯子之前的某个杯子里,不过可以移动到的范围只有一段区间.问你是否先手必胜. 一个杯子里的豆子全都等价的,因为sg函 ...

  5. P3235-[HNOI2014]江南乐【整除分块,SG函数】

    正题 题目链接:https://www.luogu.com.cn/problem/P3235 题目大意 \(T\)组游戏,固定给出\(F\).每组游戏有\(n\)个石头,每次操作的人可以选择一个数量不 ...

  6. HDU 5795 A Simple Nim 打表求SG函数的规律

    A Simple Nim Problem Description   Two players take turns picking candies from n heaps,the player wh ...

  7. 【转】博弈—SG函数

    转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ...

  8. 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)运算 ...

  9. POJ2425 A Chess Game[博弈论 SG函数]

    A Chess Game Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 3917   Accepted: 1596 Desc ...

随机推荐

  1. C# Type.GetType 返回NULL 问题解决记录

    Type.GetType("OP.Client.Html.Resources.KenFengFormMethod"); 从Dll里面获取KenFengFormMethod这个会返回 ...

  2. 4月27号开学! 第6期《jmeter实战接口自动化+性能》课程,零基础也能学

    2019年 第6期<jmeter实战接口自动化+性能>课程,4月27号开学! 主讲老师:飞天小子 上课方式:QQ群视频在线教学 本期上课时间:4月27号-6月9号,每周六.周日晚上20:0 ...

  3. 四、xadmin自定义插件1

    插件原理: Xadmin中每个页面都是一个AdminView对象返回的HTTPResponse结果. Xdamin插件所做的事情就是其实就是在AdminView执行过程中改变其执行逻辑或是改变其返回的 ...

  4. react 项目搭建

    1.首先运行环境-node是必须的,需要下载安装node的运行环境: 2.安装好了node之后,自然的就有了npm: 3.npm install -g creact-react-app/全局安装cre ...

  5. codeforces#766 D. Mahmoud and a Dictionary (并查集)

    题意:给出n个单词,m条关系,q个询问,每个对应关系有,a和b是同义词,a和b是反义词,如果对应关系无法成立就输出no,并且忽视这个关系,如果可以成立则加入这个约束,并且输出yes.每次询问两个单词的 ...

  6. 网工的Linux系统学习历程

    偶遇篇作为一名通过思科CCNP认证的网络工程师,专注于网络技术.但在日常的工作中,难免不接触到服务器,对于大多数服务器来说,鉴于稳定性等因素的考虑,基本使用的都是Linux系统,包括RHEL.Cent ...

  7. 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题

    Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...

  8. Vue-router路由使用,单页面的实现

    1.安装路由系统 NPM npm install vue-router 2.在main.js中进入引用 import VueRouter from 'vue-router' 3.创建三个空的组件: V ...

  9. YARN的笔记

  10. PHP中友好的处理方式

    在使用PHP进行开发的时候,由于PHP是弱类型语言的特性,所以,偶尔会遇到一些意想不到的错误.规范我们的编程就变得尤为重要了.下面总结一下,我日常开发中的一些经验,可能有些地方不妥,还请多多斧正,指教 ...