51nod 1791 合法括号子段 (dp)
来源:互联网 发布:张玮 high 知乎 编辑:程序博客网 时间:2024/06/05 09:54
Description
有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列。
合法括号序列的定义是:
- 空序列是合法括号序列。
- 如果 S 是合法括号序列,那么 (S) 是合法括号序列。
- 如果 A 和 B 都是合法括号序列,那么 AB 是合法括号序列。
Input
多组测试数据。
第一行有一个整数 T(1<=T<=1100000) ,表示测试数据的数量。
接下来 T 行,每一行都有一个括号序列,是一个由 ‘(’ 和 ‘)’ 组成的非空串。
所有输入的括号序列的总长度不超过 1100000 。
Output
输出 T 行,每一行对应一个测试数据的答案。
Input 示例
5(()()()(()(())
Output示例
01312
思路
首先预处理出与每一个左括号所对应的右括号的位置,
则对于每一个左括号,
AC 代码
#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3fconst int maxn = 1200000;const int mod = 1e9+7;typedef long long LL;stack<int> sk;int cnt[maxn];LL ans[maxn];char str[maxn];void solve(){ while(!sk.empty())sk.pop(); int len = strlen(str); for(int i=0; i<=len+1; i++) { ans[i] = 0; cnt[i] = -1; } for(int i=len-1; i>=0; i--) { if(str[i]==')') sk.push(i); else { if(sk.empty()) continue; cnt[i] = sk.top(); sk.pop(); } } LL res = 0; for(int i=len-1; i>=0; i--) { if(cnt[i]!=-1) { ans[i] = ans[cnt[i]+1]+1; res += ans[i]; } } printf("%lld\n",res);}int main(){ int T; scanf("%d%*c",&T); while(T--) { scanf("%s",str); solve(); }}
阅读全文
1 0
- 51nod 1791 合法括号子段 (dp)
- 51nod 1791 合法括号子段 DP
- 51nod 1791 合法括号子段(DP)
- 51Nod-1791-合法括号子段
- 51nod 1791 合法括号子段
- 51NOD 1791 合法括号子段
- 51Nod 1791 合法括号子段(栈+乱搞)
- 51nod 1791 合法括号子段(模拟)
- 51nod 合法括号子段
- 合法括号子段 51Nod
- 合法括号子段 51Nod
- 51nod 1791 合法括号子段 (队列)
- 51nod 1478 括号序列的最长合法子段
- 51Nod-1478-括号序列的最长合法子段
- 51nod-1478 括号序列的最长合法子段
- 51nod 1478 括号序列的最长合法子段
- 51 nod 合法括号子段 (单调栈)
- 1791 合法括号子段
- 全排列 (递归版)Java版
- 我的博客网站开通了
- fudandemo
- 控制不好情绪,读这9句话
- 【AC自动机】地图匹配
- 51nod 1791 合法括号子段 (dp)
- vue-cli 脚手架
- Django REST framework-教程00-quickstart原创翻译
- Spring入门笔记(五)@Autowired注解
- 升序单链表删除重复值,输出
- rocoo hotfix之后进App卡住
- Leetcode之Search for a Range 问题
- 求二叉树的深度
- linux性能分析命令ps,top,vmstat 使用