[CSP-S 2023] 消消乐 & CF1223F 题解
我们称一个字符串是可消除的,当且仅当可以对这个字符串进行若干次操作,使之成为一个空字符串。其中每次操作可以从字符串中删除两个相邻的相同字符,操作后剩余字符串会拼接在一起。
You are trying to push array elements to the stack in the order \(s_1,s_2,s_3,…,s_l\). Moreover, if the stack is empty or the element at the top of this stack is not equal to the current element, then you just push the current element to the top of the stack. Otherwise, you don't push the current element to the stack and, moreover, pop the top element of the stack. If after this process the stack remains empty, the array s is considered stack exterminable.
空串合法
如果 \(A\) 合法,那么 \(xAx\) 合法
如果 \(A,B\) 合法,那么 \(AB\) 合法
题意是可以相互转化的。和括号匹配很像,区别是不分左右
sol 1
设 \(f[i]\) 表示以 \(i\) 结尾的合法子串数量,\(g[i]\) 为以 \(i\) 为右端点的最短合法子串的左端点,则 \(f[i]=f[g[i]-1]+1\)
剩下的问题是计算 \(g[i]\)。暴力:从 \(j=g[i-1]\) 开始不断跳 \(g[j]\) 至 \(s_{j-1}=s_{j}\),则 \(g[i]=j-1\)
考虑维护一个哈希表 \(h[j,x]\) 表示从 \(j\) 开始跳,最大的 \(j\) 满足 \(s_{j-1}=x\),则 \(g[i]=h[i-1,s_{i}]-1\)。\(h[i]\) 可以先从 \(h[g[i]]\) 继承过来,再令 \(h[i,s_{i-1}]=i\)
时间复杂度 \(O(n)\)
sol 2
结论:模拟 CF 题意,\([l,r]\) 合法 \(\iff[1,l-1]\) 和 \([1,r]\) 对应的栈相等
证明:如果 \([l,r]\) 中有字符和 \([1,l-1]\) 对应的栈中字符消了,那么由于 \([1,l-1]\) 和 \([1,r]\) 对应的栈相等,\([l,r]\) 中一定又有字符补上了,且顺序是对的
用哈希表维护 \([1,l-1]\) 对应的栈的哈希值即可统计答案
code
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std; using namespace __gnu_pbds; using namespace __gnu_cxx;
#define For(i,x,y,...) for(int i=x,##__VA_ARGS__;i<=(y);++i)
#define rFor(i,x,y,...) for(int i=x,##__VA_ARGS__;i>=(y);--i)
#define Rep(i,x,y,...) for(int i=x,##__VA_ARGS__;i<(y);++i)
#define pb emplace_back
#define sz(a) int((a).size())
#define all(a) begin(a),end(a)
#define fi first
#define se second
typedef long long LL; typedef vector<int> Vi; typedef pair<int,int> Pii;
auto ckmax=[](auto &x,auto y) { return x<y ? x=y,true : false; };
auto ckmin=[](auto &x,auto y) { return y<x ? x=y,true : false; };
sfmt19937 mt(chrono::steady_clock::now().time_since_epoch().count());
int rnd(int l,int r) { return uniform_int_distribution<>(l,r)(mt); }
template<typename T=int>T read() { T x; cin>>x; return x; }
typedef unsigned long long uLL;
const int N = 2e6+5;
int n,tp;
uLL pre[N],hsh[N];
char s[N],stk[N];
gp_hash_table<uLL,int> cnt;
signed main() {
#ifdef D
freopen("in","r",stdin); freopen("out","w",stdout);
#endif
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>s+1;
For(i,1,n) {
if( tp && stk[tp] == s[i] ) --tp;
else stk[++tp] = s[i], pre[tp] = pre[tp-1] * 131 + stk[tp];
hsh[i] = pre[tp];
}
LL ans = 0;
cnt[0] = 1; For(i,1,n) ans += cnt[hsh[i]], ++cnt[hsh[i]];
cout<<ans;
return 0;
}
sol 3
注意到消除满足“结合律”(先消哪里无所谓),不满足“交换律”(不能交换字符再消),可以(?)联想到矩阵乘法
引理:\(MM^{-1}=M^{-1}M=I\),其中 \(I\) 是单位矩阵
对于每种字符,随机一个矩阵 \(M\),下标为奇数对应 \(M\),下标为偶数对应 \(M^{-1}\)(下标奇偶性相同的两个字符之间有奇数个字符,这两个字符一定不能匹配)。\([l,r]\) 合法 \(\iff[l,r]\) 对应的矩阵乘积为 \(I\)
[CSP-S 2023] 消消乐 & CF1223F 题解的更多相关文章
- 消消乐、candy crush类三消游戏程序逻辑分析
最近在开发一款类似消消乐的三消游戏,在碰到实现斜方向下落的时候卡住了很长时间.好几天没有思路,原本的思路是一次性预判多个宝石的一连串运动路径,运用缓动运动队列来实现宝石运动路径,例如 下落->滑 ...
- net.sz.framework 框架 ORM 消消乐超过亿条数据排行榜分析 天王盖地虎
序言 天王盖地虎, 老婆马上生孩子了,在家待产,老婆喜欢玩消消乐类似的休闲游戏,闲置状态,无聊的分析一下消消乐游戏的一些技术问题: 由于我主要是服务器研发,客户端属于半吊子,所以就分析一下消消乐排行榜 ...
- [LeetCode] Candy Crush 糖果消消乐
This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...
- RSP小组——消消乐
RSP小组--消消乐 团队所有博客总结 1.团队第一周作业 2.团队第二周作业 3.RSP小组--团队冲刺博客一 4.RSP小组--团队冲刺博客二 5.RSP小组--团队冲刺博客三 6.RSP小组-- ...
- PHP实现开心消消乐的算法示例
本文主要介绍了关于PHP如何实现我们大家都知道的开心消消乐的算法,分享PHP教程出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.需求描述: 1.在一个8*8的矩阵方格中随机 ...
- C#期末大作业 消消乐 2017-06-01 18:11 275人阅读 评论(0) 收藏
邻近期末,忙于刷题之余意识到期末大作业来不及了,匆匆赶下了作业,虽说做的很是粗糙,但完全原创的 下载链接 https://pan.baidu.com/s/1cCNLr4 大体的做大约3天完成了: 第一 ...
- Unity 3D游戏-消消乐(三消类)教程和源码
Unity 消消乐教程和源码 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Start Game -- ...
- 腾讯消消乐 (状态压缩DP)
腾讯消消乐 题意 给出长度为 n 的序列,每次可以选择删除序列的一个连续区间,要求这一段区间内所有数最大公约数不小于 k ,删除后剩下的序列仍然构成连续序列. 定义 f(i) 为进行 i 次操作将整个 ...
- ACM_开心消消乐
开心消消乐 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大白最近喜欢上了开心消消乐,于是英语基础好的他准备让课文中英语句子也来 ...
- 热门游戏<开心消消乐>的“加壳”诡计!!
好久没搞游戏了,前几天看了又又一次看了看<开心消消乐>的1.29最新版..于是故事開始了: 1.反编译分析 首先使用Androidkiller进行反编译,得到两个Smali代码目录:mal ...
随机推荐
- mysql多表删除指定记录
在Mysql4.0之后,mysql开始支持跨表delete. Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间的关系来删除某一个表中的记录. 假定我们有两张表:Product表和 ...
- 在WPF UWP WinUI中相同功能的用法的区别
文件选择器 WPF:OpenFileDialog Microsoft.Win32.OpenFileDialog openFileDialog = new(); bool? result = openF ...
- ADB命令与Dumpsys alarm查看应用程序唤醒命令
ADB命令与Dumpsys alarm查看应用程序唤醒命令 背景 在研究设备的低功耗突然唤醒时,看到了对应的唤醒源: [ 75.813476] suspend ns: 75813465022\x09s ...
- 2024年,AI驱动测试管理工具会有哪些发展前景呢?
随着人工智能技术的日新月异,2024年的测试管理工具将迎来全新的发展机遇.AI赋能将助力测试管理工具实现前所未有的智能化升级,为软件研发团队带来革命性的变革. 一.什么是AI? 人工智能(AI)是一种 ...
- 详解Web应用安全系列(7)使用具有已知漏洞的组件
使用具有已知漏洞的组件,这种安全漏洞普遍存在,基于组件开发的模式使得多数开发团队根本不了解其应用或API中使用的组件,更谈不上及时更新这些组件了. 下面就分别以.NET和Java各分享一个案例. .N ...
- Apifox 6月更新|定时任务、内网自部署服务器运行接口定时导入、数据库 SSH 隧道连接
Apifox 新版本上线啦!!! 看看本次版本更新主要涵盖的重点内容,有没有你所关注的功能特性: 自动化测试支持设置「定时任务」 支持内网自部署服务器运行「定时导入」 数据库均支持通过 SSH 隧道 ...
- Mybatis ResultMap复杂对象一对一查询结果映射之association
Mybatis复杂对象映射配置ResultMap的association association:映射到POJO的某个复杂类型属性,比如订单order对象里面包含user对象 表结构 项目结构 pom ...
- 用这开源小书学 Docker,香!
> 最新.全面.通俗.可多端阅读的 Docker 教程小书.>> 编程导航开源仓库:https://github.com/liyupi/code-navDocker 可以说是一个改变 ...
- 高程读后感(三)— JS对象实现继承的6种模式及其优缺点
目录 1.原型链 1.1.默认的原型 1.2.原型和实例的关系 1.3.原型链的问题 2.借用构造函数 2.1.传递参数 2.2.借用构造函数的问题 3.组合继承 4.原型式继承 5.寄生式继承 6. ...
- 从基础到高级应用,详解用Python实现容器化和微服务架构
本文分享自华为云社区<Python微服务与容器化实践详解[从基础到高级应用]>,作者: 柠檬味拥抱. Python中的容器化和微服务架构实践 在现代软件开发中,容器化和微服务架构已经成为主 ...