51nod 1791 合法括号子段

【题解】

  我们可以发现每一对可以匹配的左右括号一定是一一对应的,那么我们用一个栈维护即可。如果当前是右括号,栈顶是左括号,那么一定有1的贡献,还要加上之前到达过top-1这个位置多少次,因为现在这一对括号可以和之前的那些组成更长的序列。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define LL long long
 5 #define N 2200010
 6 #define rg register
 7 using namespace std;
 8 int n,T,top;
 9 LL ans;
10 struct stack{
11     int num; LL cnt;
12 }st[N];
13 char s[N];
14 inline int read(){
15     int k=0,f=1; char c=getchar();
16     while(c<‘0‘||c>‘9‘)c==‘-‘&&(f=-1),c=getchar();
17     while(‘0‘<=c&&c<=‘9‘)k=k*10+c-‘0‘,c=getchar();
18     return k*f;
19 }
20 int main(){
21     T=read();
22     while(T--){
23         scanf("%s",s+1); n=strlen(s+1); top=0; ans=0;
24         for(rg int i=0;i<=n;i++) st[i].cnt=0;
25         for(rg int i=1;i<=n;i++){
26             if(s[i]==‘)‘&&top>0&&st[top].num==0) ans+=(++st[--top].cnt);
27             else st[++top]=(stack){s[i]==‘(‘?0:1,0};
28 //            printf("%d %lld %lld\n",top,st[top].cnt,ans);
29         }
30         printf("%lld\n",ans);
31     }
32     return 0;
33 }

原文地址:https://www.cnblogs.com/DriverLao/p/9629815.html

时间: 2024-08-24 13:51:24

51nod 1791 合法括号子段的相关文章

51nod 1065 最小正子段和

题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N = 50001; 6 const int inf = 0x3f3f3f3f; 7 pair<long long, int> sum[N]; 8 int

九度oj 题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的左括号匹配.例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是. 需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数. 输入: 测试数据包括多个,每个测试数据包含两行: 第一行为一个整数N,其中N不会超过10^6. 第二行为一个长度为N的字

LongestValidParentheses, 求最长合法括号子串长度-----同类问题ValidParentheses,GenerateParentheses

问题描述:求括号字符串中最长合法子串长度.例如:()((),返回2,而不是4. 算法分析:还是利用栈,和判断合法括号对是一样的. 1 public static int longestValidParentheses(String s) { 2 Stack<int[]> stack = new Stack<int[]>(); 3 int result = 0; 4 5 for(int i=0; i<=s.length()-1; i++) 6 { 7 char c = s.ch

九度oj 题目1342:寻找最长合法括号序列II

题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即最长的合法括号序列. 输入: 测试数据包括多个,每个测试数据只有一行,即一个随机的括号序列,该括号序列的长度保证不超过106. 输出: 对于每个测试案例,输出一个整数,表示最后剩下的最长合法括号序列长度. 样例输入: (())() (() 样例输出: 6 2 这个题和1337求的是不一样的代码如下

[Jobdu] 题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的左括号匹配.例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是. 需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数. 输入: 测试数据包括多个,每个测试数据包含两行: 第一行为一个整数N,其中N不会超过10^6. 第二行为一个长度为N的字

合法括号【栈】

合法括号 发布时间: 2018年4月2日 20:46   时间限制: 1000ms   内存限制: 128M 描述 给定字符串,只包含以下括号:'(', ')', '{', '}', '[' and ']' , 判断输入是否合法.括号匹配必按照要求:"()" and "()[]{}", 而不是 "(]" and "([)]" 输入 输入包含多组测试数据,每组测试数据占一行,不超过80个字符的字符串. 输出 对于每组测试数据,如

python 题目:斐波那契数列计算;题目:站队顺序输出;题目:合法括号组合的生成;题目:用户登录(三次机会)

斐波那契数列计算 B 描述 斐波那契数列如下: F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) 编写一个计算斐波那契数列的函数,采用递归方式,输出不超过n的所有斐波那契数列元素 调用上述函数,完成如下功能: 用户输入一个整数n,输出所有不超过n的斐波那契数列元素.输出数列的元素和及平均数,输出按照顺序,用英文逗号和空格分割 此题目为自动评阅,请严格按照要求规范输入和输出. def jebona(n): if n==0: return 0 elif n == 1

数据结构大师(求区间最长合法括号子序列)

数据结构大师 时间限制: 1 Sec 内存限制: 128 MB 题目描述 小$Z$是个数据结构高手,这天他得到了一个由左括号和右括号组成的字符串.随之而来的是 \(m\) 次询问,对于第 \(i\) 次询问,小Z需要回答出这个字符串的第$l_i$ 到$r_i$ 个字符组成的字串中最长的合法括号子序列的长度. 小$Z$认为一个由左右括号组成的序列$A$合法,当且仅当其满足至少一个以下条件. $A$为空. $A=(B)$其中$B$是一个合法的括号序列. \(A=BC\),其中$BC$都是合法的括号序

【51NOD 1478】括号序列的最长合法子段

很恶心啊,一道水题改了半天,主要是各种细节没有注意到,包括左括号剩余时有可能会出错的情况,需要从后往前扫 贡献一组测试数据: ((()))())(())(( 答案:8 1 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1E6 + 3; char s[N]; int main() { scanf("%s", s); in