关于求合法括号子序列个数
1.数塔2.[洛谷P2014] 选课3.玉蟾宫 (悬线DP)4.MooFest POJ-1990 (树状数组)5.情书密码 (树状数组)6.[SCOI 2009] 迷路 (矩阵快速幂)7.[BZOJ3306] 树8.[NOI2002] 荒岛野人9.SHUFFLE 洗牌 (扩展欧几里得+龟速乘)10.[SDOI2009] Bill的挑战 (状压DP)11.P4168 [Violet] 蒲公英 (莫队的强制在线)12.P3667 [USACO17OPEN] Bovine Genomics G (set容器+二分)13.P7903 兜心の顶(构造)14.[BZOJ2720 Violet 5]列队春游(概率期望+组合数学)15.划分大理石(多重背包)16.P5746 [NOI2002] 机器人M号17.苍与红的试炼(数位DP)18.【唐赛】高一小学期219.P10779 BZOJ4316 小 C 的独立集 (仙人掌DP)
20.关于求合法括号子序列个数
求合法括号子序列个数
发了近半天时间都没人发现里面的致命错误() 还好我悄咪咪改了
题意
背景
合法括号串的定义如下:
()
是合法括号串。- 如果
A
是合法括号串,则(A)
是合法括号串。 - 如果
A
,B
是合法括号串,则AB
是合法括号串。
子串与不同的子串的定义如下:
- 字符串
S
的子串是S
中连续的任意个字符组成的字符串。S
的子串可用起始位置 与终止位置 来表示,记为 ( , 表示 S 的长度)。 S
的两个子串视作不同当且仅当它们在S
中的位置不同,即 不同或 不同。
题目
给出一个括号串
样例
样例输入
(()()
样例输出
3
分析
观察序列1:
()()()
总之,
观察序列2:
())()
观察序列3:
()(())
可以发现,一个后括号如果能匹配一个前括号,假设这个前括号的前1位同样有一个已经匹配了的后括号,那么我们就可以把当前的匹配括号序列和之前的匹配括号序列合并。当前的这个后括号的贡献值,其实就等于前面那个后括号的贡献值 + 1。
Elaina's Code
int sum=0,tot[N];
string s;
stack<int> sta;
signed main(){
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='(') sta.push(i);
if(s[i]==')'){
if(!sta.empty()){
int l=sta.top();
sta.pop();
tot[i]=tot[l-1]+1;
}
}
sum+=tot[i];
}
cout<<sum;
return Elaina;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本