首页 > 其他分享 >CF1037G A Game on Strings Sol

CF1037G A Game on Strings Sol

时间:2023-02-18 10:00:24浏览次数:56  
标签:26 函数 int Game 这道题 calc SG Strings CF1037G

有趣题。

首先"分成若干个互不相干的子串"是子游戏的定义,可以用 SG 函数处理。

然而接下来试着打了半个多小时的表,没有找到任何规律。

但是发现 SG 函数的状态转移是很简单的。一般 SG 函数难以优化的点在于 \(\text{MEX}\) 操作不太平易近人,这道题中让你取 \(\text{MEX}\) 的只有 26 个数完全可以暴力去做。

进一步地,我们想到这道题中能够成为”子游戏“的子区间是很有限的,对于删去某个字符形成的若干段字符串,只有这些串的前缀后缀是需要计算 SG 函数的。

所以我们只需要按照这些串的长度从小到大计算 SG 值即可。

TLE submission

然而事情并不是那么美好,如果没注意好实现细节直接拿 std::map 维护 SG 值会多 \(\log\),复杂度达到了 \(O(n|\Sigma|^2\log n)\)。

于是重构了一遍代码,考虑按右端点和串长度双关键字的顺序计算这些区间,并且用合适的数组替换掉数据结构,复杂度 \(O(n|\Sigma|^2)\)。

这道题实现还是很有技巧的,应该要有 implementation 的标签。

#include <bits/stdc++.h>
using namespace std;
const int N=100003;
char s[N];
int n,q;
int a[N][26],fa[N][26];
int b[N][26],fb[N][26];
int f[N],cur[26];
int calc(int l,int r){
	if(l>r) return 0;
	unsigned int st=0;
	for(int c=0;c<26;++c){
		int pl=a[l][c],pr=b[r][c];
		if(pl<=pr) st|=1u<<(f[pl]^f[pr]^fa[l][c]^fb[r][c]);
	}
	return __builtin_ctz(~st);
}
int stk[26];
int main(){
	scanf("%s",s+1);
	n=strlen(s+1);
	for(int c=0;c<26;++c) a[n+1][c]=n+1;
	for(int i=n;i;--i){
		memcpy(a[i],a[i+1],104);
		a[i][s[i]-97]=i;
	}
	for(int c=0;c<26;++c) b[0][c]=0;
	for(int i=1;i<=n;++i){
		memcpy(b[i],b[i-1],104);
		b[i][s[i]-97]=i;
	}
	for(int c=0;c<26;++c) stk[c]=c;
	for(int i=1;i<=n;++i){
		int c=s[i]-97;
		f[i]=f[cur[c]]^fb[i-1][c];cur[c]=i;
		sort(stk,stk+26,[&](int x,int y){return b[i][x]>b[i][y];});
		for(int t=0;t<26;++t){
			int o=stk[t];
			if(b[i][o]<i) fb[i][o]=calc(b[i][o]+1,i);
		}
		if(i<n){
			int cc=s[i+1]-97;
			for(int j=i;j>cur[cc];--j) fa[j][cc]=calc(j,i);
		}
	}
	scanf("%d",&q);
	while(q--){
		int l,r;
		scanf("%d%d",&l,&r);
		if(calc(l,r)) puts("Alice");
		else puts("Bob");
	}
	return 0;
}

标签:26,函数,int,Game,这道题,calc,SG,Strings,CF1037G
From: https://www.cnblogs.com/yyyyxh/p/gameonstr.html

相关文章

  • uniapp开发在hbuilderx运行小程序时微信开发者工具编辑出错:error:game.json:未找到gam
      uniapp开发在hbuilderx运行小程序时微信开发者工具编辑出错:error:game.json:未找到game.json文件,或者文件读取失败处理。是因为我当前登录微信开发者账号是开发小程......
  • 【CF207C3】Game with Two Trees
    【CF207C3】GamewithTwoTreesDescription有两颗动态加入点的树,每条边有一个字符每次加入完点后T1中到根的链在T2中的匹配次数之和Input一行一个数\(q\)Output输......
  • [ABC272F] Two Strings 题解
    [ABC272F]TwoStringsSolution目录[ABC272F]TwoStringsSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定两字符串$S,T$,求......
  • hgame2023
    hgame2023week1‍test_ncnc签到‍easy_overflow​​有后门pl=b'a'*0x18+p64(0x40117E)p.sendline(pl)​​close(1)关闭了标准输出首先我们要明白什么是标准输......
  • Go-31 Go中字符串切割的三种方法 strings.Index()、strings.Cut()、strings.Split()
    packagemainimport( "fmt" "strings")/* 字符串切割 strings包对字符串的操作 */funcmain(){ //方法一 addr:="192.168.0.1:80" pos:=strings.Index(ad......
  • C、Grid game 【 Codeforces Round #534 (Div. 2) 】
    C、Gridgame题意:给你一个4×4的方格,然后给你一些1×2或者2×1的小方格,当这些方格在一行或者一列的时候会消除掉,问最佳放置位置。思路:QAQ,什么时候思维会变强......
  • Fire Game (FZU 2150)(BFS)
    题解:一开始想错了,以为只要烧完就是那个答案,但是这不是最优的结果,需要每两个点都bfs一遍,找到如果能够全部烧完,找到花费时间最小的,如果不能return-1。在bfs的时候,记录答案......
  • 使用精灵组对精灵成员编队 pygame 230213
    定义精灵成员定义了两个精灵成员说明:Background类是精灵类的子类定义精灵组精灵组添加精灵语法:精灵组.add(精灵成员)批量更新数据语法:精灵组.update()说明:目的是让所有的精灵......
  • 2023Hgame
    2023HgameSharedDiary源代码先放一下constexpress=require('express');constbodyParser=require('body-parser');constsession=require('express-session')......
  • Hgame-2023-week3-Re
    Hgame2023week3Reverse1.kmusic首先点开.exe文件运行(如果没有安装.netruntime,那么他会提醒你先下载,也可以在这里手动下载)。打开是一个如下界面:点击会有对应......