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 ...
随机推荐
- Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...
- 如何查看IntelliJ IDEA的版本信息
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. IDEA的版本信息问题 额,说实在的,这篇文章十三一开始也不是很想整 ...
- Jenkins- job之间传参
前言: 本文介绍插件: Parameterized Trigger plugin的具体使用方法. 一.插件介绍 Parameterized Trigger plugin插件可以让你在构建完成时触发新的 ...
- MySQL添加用户错误:ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value解决方法
MySQL添加新用户时出现如下报错,如下图: 经过查资料了解到: mysql用户表的中某些字段不能为空,没有默认值,其实是操作错误,mysql添加用户是不能这样直接insert user表的. 改为以 ...
- 使用Request+正则抓取猫眼电影(常见问题)
目前使用Request+正则表达式,爬取猫眼电影top100的例子很多,就不再具体阐述过程! 完整代码github:https://github.com/connordb/Top-100 总结一下,容 ...
- Day6 Pyhton基础之文件操作(五)
能调用方法的一定是对象 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 #-*-codeing-*-:UTF-8 #author:Weina Pang # ...
- iOS-拍照后裁剪,不可拖动照片的问题
2016.07.08 15:04* 字数 1837 阅读 6066评论 6喜欢 26赞赏 1 问题 在项目中,选择照片或拍照的功能很长见,由于我之前采用系统自带的UIimagePickViewCont ...
- Tomcat Cluster
Tomcat群集配置| Tomcat集群| MuleSofthttps://www.mulesoft.com/tcat/tomcat-cluster Tomcat Clustering - A Ste ...
- vue实现双向数据绑定之Object.defineProperty()篇
前言 vue.js中使用ES5的Object.defineProperty()实现数据的双向绑定 Object.defineProperty()原理 Object.defineProperty()可以 ...
- pojo类自动生成序列化ID
自动生成序列化ID