当前位置: 首页 > news >正文

2025牛客暑期多校训练营4 G Ghost in the Parentheses 题解记录

大致题意:给定一个合法的括号序列,经过变换以后,任意一个字符都有12\frac{1}{2}21独立的概率变成???。有多大的概率,使得原括号序列在变换以后,得到的新序列是唯一合法的?
解:
针对括号序列相关题,一般都可以设置(((+1+1+1)))−1-11。合法代表前缀和为000。要想新序列是唯一合法的,其只能被还原为原来的序列,并且左括号与右括号数量上要跟原来的保持一致。由此,只是几个+1+1+1−1-11位置上调换。
要想唯一,如果调换过后是非法的,那么就说明只有原序列是合法的,进而推出唯一合法。考虑什么时候调换以后是非法的。
同类型的括号交换是没有意义的,只能交换不同类型的括号。如果一个形如)…()\dots()(这样的子序列,在原先合法的情况下交换一定仍然是合法的,会出现多个合法性,不唯一;而对于(…)(\dots)()这样的,根据计算过的前缀和(高度),如果中间出现某个位置的hi≤1h_i\le1hi1,交换过后这个位置的高度会<0\lt0<0,此时就是不合法、唯一的。关于高度问题,见此。定义iiisi=′(′s_i='('si=(,其右边最近的jjj,满足∃k∈[i,j),hk≤1\exists k\in[i,j),h_k\le1k[i,j)hk1sj=′)′s_j=')'sj=)。对于jjj及其右边的))),即sufjsuf_jsufj个右括号,不论它们是否变成问号,只要iii位置上为括号,那么就是唯一的。因为这个位置不能变成右括号,只能是左括号。然后根据数量上守恒,右括号仍然是右括号。
同理对于iii左边的左括号,这prei−1pre_{i-1}prei1个左括号如果变成问号,也是唯一的、不能变化的。如果右边的某个右括号跟左边某个左括号互换,那么就会导致中间kkk的位置高度出现负数,不合法。
由此,可以用类似单调栈的东西记录下每个左括号右边距离其最近的高度小于等于111的位置,然后再记录每个高度小于等于111的位置其右边最近的右括号的位置。

	vector<int> h(len + 1);vector<int> pre(len + 1), suf(len + 5);for (int i = 1; i <= len; i++) {h[i] = h[i - 1] + (s[i] == '(' ? 1 : -1);pre[i] = pre[i - 1] + (s[i] == '(' ? 1 : 0);}for (int i = len; i >= 1; i--) {suf[i] = suf[i + 1] + (s[i] == ')' ? 1 : 0);}int cnt = 0;vector<int> r0(len + 1);queue<int> q;for (int i = 1; i <= len; i++) {if (s[i] == '(') {q.push(i);}if (h[i] <= 1) {while (q.size()) {r0[q.front()] = i;q.pop();}}}vector<int> rn(len + 1);queue<int> qq;for (int i = 1; i <= len; i++) {if (h[i] <= 1) {qq.push(i);}if (s[i] == ')') {while (qq.size()) {rn[qq.front()] = i;qq.pop();}}}

然后开始计数。

	cnt = add(cnt, qp(2, suf[1], mod));for (int i = 1; i <= len; i++) {if (s[i] == '(') {int l = pre[i - 1];int temp = rn[r0[i]];if (temp == r0[i])temp++;int r = suf[temp];cnt = add(cnt, qp(2, l + r, mod));}}int inv2 = qp(2, mod - 2, mod);cout << mul(cnt, qp(inv2, len, mod)) << endl;

这里需要注意一个东西,如果某个高度小于等于111的位置本身就是右括号,那么这个位置就算交换了也是合法的,导致结果不唯一。所以此时计右括号数量的时候要−1-11

http://www.xdnf.cn/news/1395793.html

相关文章:

  • Day17 Docker学习
  • uac播放与录制
  • 论文阅读:arixv 2025 WideSearch: Benchmarking Agentic Broad Info-Seeking
  • React Three Fiber
  • LBM——大型行为模型助力波士顿人形Atlas完成多任务灵巧操作:CLIP编码图像与语义,之后DiT去噪扩散生成动作
  • 编程速递:RAD Studio 13 即将到来的功能
  • Linux 线程调度核心要点
  • Shell 脚本基础教程
  • java序列化
  • Android系统框架知识系列(十九):Android安全架构深度剖析 - 从内核到应用的全栈防护
  • python学习打卡day48
  • “白月光”焦点何晟铭现身宁夏中宁,助力非遗与三农发展
  • 拎包入住搭建 Browser Use Agent:基于PPIO Model API +Agent 沙箱的一体化构建
  • 变量声明方式
  • linux学习-数据库
  • 中科米堆CASAIM五金配件三维扫描测量尺寸形位公差
  • 嵌入式Linux驱动开发:i.MX6ULL平台设备驱动
  • 使用 Docker 部署 Squid 为 Kubernetes 中的 Nexus3 提供公网代理访问
  • linux 条件变量与生产消费者模型
  • 玳瑁的嵌入式日记D29-0829(进程间通信)
  • Python OpenCV图像处理与深度学习:Python OpenCV开发环境搭建与入门
  • 基于能量方法的纳维-斯托克斯方程高阶范数有界性理论推导-陈墨仙
  • STM32CubeMX + HAL 库:基于 I²C 通信的 AHT20 高精度温湿度测量实验
  • 【系列03】端侧AI:构建与部署高效的本地化AI模型 第2章:端侧AI硬件入门
  • 134-细粒度多尺度符号熵和鲸鱼优化算法的滚动轴承故障诊断技术MSVM
  • Redis搭建哨兵模式一主两从三哨兵
  • 线程安全及死锁问题
  • 【好题推荐】运算符的构造运用
  • 光伏发多少电才够用?匹配家庭用电需求
  • #医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(五)