news 2026/10/8 2:12:39

题解:洛谷 P3015 [USACO11FEB] Best Parenthesis S

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
题解:洛谷 P3015 [USACO11FEB] Best Parenthesis S

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

洛谷:P3015 [USACO11FEB] Best Parenthesis S

【题目描述】

给定一个只包含左右括号的字符串,得分规则如下:

如果一对括号内没有括号,那么这对括号的得分为1;如果两对括号互不包含(即并列存在),那这两对括号的得分相加;如果括号内包含一对括号,那么这个括号的得分记为内部括号序列的得分× 2 \times 2×2。

例如:对于这样一个字符串:() (),两对括号并列存在,则得分为1 + 1 = 2 1+1=21+1=2;

而对于这样一个字符串:(()),最外层的括号内层包含一对括号,则得分为2 × 1 = 2 2 \times 1 = 22×1=2。

Bessie 想击败所有同事的牛,所以她需要计算某个字符串的评分。给定一个长度为n nn、只包含括号的字符串(2 ≤ N ≤ 100000 2 \le N \le 1000002≤N≤100000),计算其得分帮助 Bessie。

【输入】

第一行,输入一个整数n nn。
接下来n nn行,每行一个数字,如果是0 00,表示这个字符是(;如果是1 11,表示这个字符是)。

【输出】

字符串的分数,由于数字可能会变得很大,所以对12345678910 1234567891012345678910取模。

【输入样例】

6 0 0 1 1 0 1

【输出样例】

3

【核心思想】

  1. 问题分析:给定一个长度为N NN(N ≤ 10 5 N \le 10^5N≤105)的括号序列,其中字符0代表左括号(,字符1代表右括号)。根据规则计算得分:空括号()得1 11分;并列括号得分相加;嵌套括号的得分为内部得分× 2 \times 2×2。需要对结果取模12345678910 1234567891012345678910。本质是括号匹配与树形结构计算问题,可以用栈模拟括号的嵌套和并列关系。

  2. 算法选择:

    • 栈模拟:维护一个栈,每个元素存储当前层的累计得分和是否包含过括号的标记。遇到左括号时压入新层(得分 0,标记 false);遇到右括号时弹出栈顶,计算当前括号对的得分:
      • 若该层内部未包含括号(标记为 false),则当前括号对为空,得分为1 11。
      • 若内部包含括号,则得分为内部得分 * 2。
    • 然后将当前括号对的得分加到新的栈顶元素的累计得分中(表示并列相加),并标记新栈顶为已包含括号。
    • 最后栈底元素即为总得分。
  3. 关键步骤:

    • 读入与转换:读取N NN,逐个读入数字(0 或 1)。
    • 栈初始化:stk.push({0, false}),作为总得分的容器。
    • 处理左括号(0):压入新层{0, false}。
    • 处理右括号(1):
      • 弹出栈顶cur。
      • 计算当前层得分:score = cur.second ? (2 * cur.first) % mod : 1。
      • 将score加到当前栈顶的累计得分上:stk.top().first = (stk.top().first + score) % mod。
      • 标记当前栈顶为包含括号:stk.top().second = true。
    • 输出:栈底元素的first即为答案。
  4. 时间/空间复杂度:

    • 时间复杂度:O ( N ) O(N)O(N),每个字符入栈或出栈一次。
    • 空间复杂度:O ( N ) O(N)O(N),栈在最坏情况下存储N NN个元素。
  5. 栈模拟括号树的核心思想:

    • 括号层次结构:括号序列天然形成一棵树,每对括号是一个节点,并列关系对应兄弟节点,嵌套关系对应父子节点。
    • 栈的层叠性:用栈的压入和弹出模拟树的深度优先遍历,每个栈帧存储当前节点的累计得分和是否包含子节点。
    • 得分规则转换:空括号()对应叶子节点,得分为 1;嵌套括号对应父节点,得分为子节点得分 * 2;并列括号对应兄弟节点,得分相加。
    • 取模处理:由于得分可能极大,每次加法后立即对12345678910 1234567891012345678910取模。
    • 适用场景:适用于括号序列的解析和计算,特别是涉及嵌套和并列复杂度的表达式求值。

【算法标签】

#普及 #栈

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmod=12345678910;// 取模数intn;stack<pair<int,bool>>stk;// 栈元素:first为当前段累计得分,second表示该段内是否已经包含括号signedmain(){cin>>n;// 栈底放入一个初始元素,作为最终总得分的容器stk.push({0,false});// 逐个读入字符:0 代表 '(',1 代表 ')'for(inti=1;i<=n;i++){intx;cin>>x;// 左括号:压入新的一层,初始得分0,且尚未包含内部括号if(x==0){stk.push({0,false});}// 右括号:处理当前最内层括号else{autocur=stk.top();// 当前层(被右括号闭合的括号对)stk.pop();// 如果该层内部已经包含括号(即 cur.second == true),// 则当前括号对的得分为内部得分乘以2;// 否则该括号对为空,得分为1intscore=cur.second?(2*cur.first):1;// 将当前括号对的得分加入到外层(新栈顶)的累计得分中,// 因为并列括号得分相加stk.top().first=(stk.top().first+score)%mod;// 标记外层已经包含了至少一个括号(即内部不为空)stk.top().second=true;}}// 栈底元素存储了整个字符串的总得分cout<<stk.top().first<<endl;return0;}

【运行结果】

6 0 0 1 1 0 1 3
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 2:12:00

MLAG代码梳理:跨设备链路聚合的peer-link、keepalive与表项同步

最近把 MLAG 模块的代码从头到尾梳理了一遍&#xff0c;趁热记下这份心得笔记。MLAG 在交换机软件里是典型的“看概念很简单&#xff0c;真追代码到处都是细节”的模块&#xff1a;涉及两台设备的状态协商、跨设备的表项同步、硬件转发的去中心化设计&#xff0c;还有 peer-lin…

作者头像 李华
网站建设 2026/10/8 2:11:29

一张截图秒变前端代码:ScreenCoder 架构全拆解,模块化多智能体如何把「看图写码」做到像素级还原

文章目录 一、一个前端人都懂的痛 二、先看全貌:ScreenCoder 功能全景图 三、为什么「单打独斗」的大模型一定会翻车? 错误类型一:感知错误(Perception Errors) 错误类型二:规划错误(Planning Errors) 四、核心架构:三段式流水线 + 一个收尾环节 五、阶段一 定位:让…

作者头像 李华
网站建设 2026/10/8 2:10:42

改变ACDC模块的输出电压:CR52177

提高直流模块输出电压测量两款220V转换DC模块&#xff1a;输出5V电压&#xff0c;800mA&#xff0c;1100mACR624X DatasheetLP3773H 产忙完自供电圆边反馈控制芯片CR52177极简自供电原边PWM开关 损坏原因分析 之前的一个模块经过修改之后&#xff0c;将原来的43.2k欧姆修改为…

作者头像 李华
网站建设 2026/10/8 2:10:11

语义搜索进阶:DeepSeekEmbedding相似度匹配与向量检索实战

简介&#xff1a;这份PDF文档面向希望掌握语义搜索与向量相似度匹配的开发者与算法学习者&#xff0c;以DeepSeekEmbedding为核心&#xff0c;系统讲解从文本向量化到相似度计算的完整实战路径。内容涵盖语义搜索与传统关键词搜索的区别、DeepSeekEmbedding的模型架构与训练过程…

作者头像 李华
网站建设 2026/10/8 2:09:51

算法系列6:模拟

**&#x1f3ac; 博主名称**&#xff1a;迷途之人不知返&#x1f525; 个人专栏: 《C语言》、《数据结构》、《C》、《Linux》 &#x1f5c2;️ Gitee仓库: 《C语言》、《数据结构》、《C》、《Linux》 </> 算法专栏: 《算法精选集》 模拟1 > 替换所有的问号2 > …

作者头像 李华
网站建设 2026/10/8 2:09:51

工业级电源路径守护系统:TPS259483+STM32F412RE软硬协同设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华