文章目录

  • 题意
  • 思路
  • 代码

题意

给出一个串SSS。

然后nnn对li,ril_i,r_ili​,ri​,表示S[li,ri]S[l_i,r_i]S[li​,ri​]这个子串(下标从1开始)。

对于一组子串,玩两种游戏。两种游戏操作相同,就是选一个串,在他后面加上一个字符使他仍旧是SSS的子串。

第一种游戏最后不能操作的人输,第二种游戏最后不能操作的人赢。

对于每个i≤ni\le ni≤n,求前iii个子串做两个游戏,分别是先手胜还是后手胜。

思路

首先把SAM建出来。发现问题变为了:在一个DAG上,从某个节点出发,走到不能再走为止,不能走的人赢/输。

显然使用SG函数,在SAM上DP。"不能走的输"套上NIM游戏结论,"不能走的赢"套上反NIM游戏结论,问题就解决了。虚假。根据现在已经可以公开的情报,anti-nim游戏并不是总是适用于anti-SG问题。搜索“anti-SG”便可以找到反例。

至于如何快速找到一个子串所在的节点,可以在parent树上倍增,找到深度最深的maxlen大于等于子串长度的节点,就是子串所在节点,一次询问O(log⁡∣S∣)O(\log |S|)O(log∣S∣)。倍增的操作我比赛的时候并没有想到,可以说我是菜的不行了。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, M = 5e5 + 10, E = 25;
namespace SAM
{const int PN = N<<1, S = 26;int last, cnt, fa[PN][E], ch[PN][26], len[PN];void reset(){last = cnt = 1;}void Copy(int x, int y){for (int i = 0; i < S; ++ i){ch[y][i] = ch[x][i];}fa[y][0] = fa[x][0];}int insert(char c){c -= 'a';int p = last, np = ++cnt;last = np;len[np] = len[p]+1;while (p && !ch[p][c]){ch[p][c] = np, p = fa[p][0];}if (p == 0) fa[np][0] = 1;else{int q = ch[p][c];if (len[q] == len[p]+1) fa[np][0] = q;else{int nq = ++cnt;Copy(q, nq);len[nq] = len[p]+1;fa[q][0] = fa[np][0] = nq;while (p && ch[p][c] == q){ch[p][c] = nq, p = fa[p][0];}}}return np;}
}
using namespace SAM;
string s;
int sn, n, q[M][2], dp[PN], pos[N];
bool tmp[S+1];
int ton[N], id[PN];void fake_sort()
{for (int i = 1; i <= cnt; ++ i) ton[len[i]]++;for (int i = 1; i <= sn; ++ i) ton[i] += ton[i-1];for (int i = cnt; i >= 1; -- i) id[ton[len[i]]--] = i;
}void get_dp_and_fa()
{for (int ii = cnt; ii >= 1; -- ii){int i = id[ii];memset(tmp, 0, sizeof(tmp));for (int j = 0; j < S; ++ j)if (ch[i][j]){tmp[dp[ch[i][j]]] = 1;}for (int j = 0; j <= S; ++ j)if (tmp[j] == 0){dp[i] = j;break;}}for (int ii = 1; ii <= cnt; ++ ii){int i = id[ii];for (int j = 1; j < E; ++ j)fa[i][j] = fa[fa[i][j-1]][j-1];}
}int get_u(int u, int _len)
{for (int i = E-1; i >= 0; -- i)if (len[fa[u][i]] >= _len)u = fa[u][i];return u;
}void solve1()
{int ans = 0, maxx = 0, cnt = 0;for (int i = 1; i <= n; ++ i){int l = q[i][0]-1, r = q[i][1]-1;int u = get_u(pos[r], r-l+1);ans ^= dp[u];if (dp[u] == 1) ++ cnt;maxx = max(maxx, dp[u]);puts(ans ? "Fir" : "Sec");if (maxx <= 1 && cnt % 2 == 0) puts("Fir");else if (maxx > 1 && ans != 0) puts("Fir");else puts("Sec");}
}int main()
{ios::sync_with_stdio(false);cin >> s >> n;sn = s.size();for (int i = 1; i <= n; ++ i)cin >> q[i][0] >> q[i][1];reset();for (int i = 0; i < sn; ++ i)pos[i] = insert(s[i]);fake_sort();get_dp_and_fa();solve1();return 0;
}

【香蕉oi】Game(SAM,SG函数,假题)相关推荐

  1. [AcWing] 1319.移棋子游戏 博弈论 Sg函数板子题

    题目链接:1319.移棋子游戏 题解 好久没写博弈论的题了,写几道复习一下,博弈论SG主要由两大部分组成:SG函数和SG定理 SG(x)=mex(S),其中S是x的后继状态的SG函数值集合,mex(S ...

  2. HDU-1848--博弈SG函数模板题

    这篇文章写的很好,值得转发. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数. 例如mex{0,1,2,4}=3.mex{2,3 ...

  3. 闲来无事刷水题、简单博弈论专题、sg函数、洛谷

    记 今天闲来无事,不想刷codeforces了,到洛谷提高组训练营找几道水题刷着玩玩(虽然自己早已过了打OI的年纪)- 简单博弈论专题 P1199 三国游戏 这么考虑,由于电脑总是不能让我搭配出当前能 ...

  4. 2016多校联合训练1 B题Chess (博弈论 SG函数)

    题目大意:一个n(n<=1000)行,20列的棋盘上有一些棋子,两个人下棋,每回合可以把任意一个棋子向右移动到这一行的离这个棋子最近的空格上(注意这里不一定是移动最后一个棋子),不能移动到棋盘外 ...

  5. 一类SG函数递推性质的深入分析——2018ACM陕西邀请赛H题

    题目描述 定义一种有根二叉树\(T(n)\)如下: (1)\(T(1)\)是一条长度为\(p\)的链: (2)\(T(2)\)是一条长度为\(q\)的链: (3)\(T(i)\)是一棵二叉树,它的左子 ...

  6. HDU - 1847 Good Luck in CET-4 Everybody!(sg函数,水题)

    题目链接:点击查看 题目大意:给出n张牌,两个人轮流摸牌,每次只能摸2的幂次,问先手必胜还是必败 题目分析:简单sg打表题,先预处理出sg表,然后O(1)查询即可 #include<iostre ...

  7. Trie树合并 + SG函数 ---- BZOJ4730. Alice和Bob又在玩游戏(动态开点Trie 树上全局异或标记 + 合并 + 博弈论)

    题目大题 题目大意: 解题思路: 首先我们对于子树u的SG函数为SG函数为SG函数为 ⨁是异或和\bigoplus是异或和⨁是异或和 SG[u]=mex{⨁w∈(w的父亲在u到v的路径上)SG[w]∣ ...

  8. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 871  Solved: 365 [Submit][Status][Discuss] Descripti ...

  9. hdu1848(sg函数打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意:中文题诶- 思路:直接sg函数打表就好了 代码: 1 #include <iostr ...

最新文章

  1. 三代组装软件canu学习笔记
  2. 我看过的C++方面的好文章
  3. 12.1简介Object类
  4. C++ Primer 5th笔记(10)chapter10 泛型算法 :泛型算法结构
  5. (原创).Net将EF运用于Oralce一 准备工作
  6. librtmp实时消息传输协议(RTMP)库代码浅析
  7. java 纯面向对象_Java到底是不是一种纯面向对象语言?
  8. Perl文件读写操作
  9. 比起月薪过万的程序员大多数人居然选择了月薪3K的公务员?
  10. 理解SSD多盒-实时目标检测
  11. 【Kafka】Kafka使用代码设置offset值
  12. 深度学习资源一网打尽!论文、数据集、框架、课程、图书等应有尽有
  13. element Table表格隐藏列
  14. Winform界面中实现通用工具栏按钮的事件处理
  15. Memcached内存分配机制
  16. 自学笔记-使用MyBatis建立数据库基本连接
  17. imx8 uuu烧录
  18. STM32F401超声波proteus仿真
  19. 疫情影响下普惠金融风险与对策
  20. matlab提取数据的一部分,matlab如何提取数组中的满足一定范围的一段数据

热门文章

  1. 单片机16个灯四种花样c语言,基于Proteus的MSP430单片机仿真实例5-16个花样灯控制...
  2. [转]微服务与Docker
  3. java宠物健康值_Java优化宠物系统 求代码 求注解
  4. tomcat设置https端口时,8443和443区别:
  5. 项目学习--谷粒商城
  6. HPLC鬼峰、基线漂移、拖尾、分叉峰、保留时间漂移、柱压过高等系列问题解析
  7. NAND FLASH编程器烧录详解
  8. unity3d 混淆
  9. 应用上云2小时烧掉近50万,创始人:差点破产
  10. Salesforce学习之路-developer篇(五)一文读懂Aura原理及实战案例分析