#18. 括号画家——Yucai OJ第16次测试
问题描述
HYM是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。 这一天,刚刚起床的 HYM 画了一排括号序列,其中包含小括号()、中括 号[]和大括号{},总长度为 N。这排随意绘制的括号序列显得杂乱无章,于是 HYM定义了什么样的括号序列是美观的: (1) 空的括号序列是美观的; (2) 若括号序列 A 是美观的,则括号序列(A)、[A]、{A}也是美观的; (3) 若括号序列 A、B 都是美观的,则括号序列 AB 也是美观的; 例如 [(){}]() 是美观的括号序列,而 )({)[}]( 则不是。 现在 Candela 想在她绘制的括号序列中,找出其中连续的一段,满足这段子 序列是美观的,并且长度尽量大。你能帮帮她吗?。
输入格式
第一行为 1 个长度为 N 的括号序列。
输出格式
一个整数,表示最长的美观的连续子序列的长度。
样例输入1
[[[[]]{}]]
样例输出1
10
样例输入2
({({(({()}})}{())})})[){{{([)()((()]]}])[{)]}{[}{)
样例输出2
4
数据范围
测试点编号 | NN | 特殊约定 |
---|---|---|
1 | 5 | 存在部分数据,整个括号 序列都是合法的。 也存在部分数据,整个括 号序列的任何一个连续子 序列都不是合法的。 |
2 | 10 | |
3 | 50 | |
4 | 100 | |
5 | 100 | |
6 | 1000 | |
7 | 1000 | |
8 | 10000 | |
9 | 10000 | |
10 | 10000 |
时空限制
0.1S/512MB
题解:
如果有了思路其实很简单^_^。
标程:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 const int N=10005; 3 int hj[N]; 4 char s[N]; 5 int kh(char c){ 6 if(c=='('){ 7 return 1; 8 }else if(c==')'){ 9 return -1; 10 }else if(c=='['){ 11 return 2; 12 }else if(c==']'){ 13 return -2; 14 }else if(c=='{'){ 15 return 3; 16 }else if(c=='}'){ 17 return -3; 18 } 19 return 0; 20 } 21 int main(){ 22 int a,b,c; 23 while(scanf("%s",s)){ 24 a=b=c=0; 25 for(int i=0;i<strlen(s);i++) { 26 int p=kh(s[i]); 27 if(p+hj[b]==0) { 28 a++; 29 b--; 30 }else if(p>0) { 31 hj[++b]=p; 32 a++; 33 }else{ 34 if(b){ 35 a-=b; 36 } 37 if(c<a){ 38 c=a; 39 } 40 a=b=0; 41 } 42 } 43 if(b){ 44 a-=b; 45 } 46 if(c<a){ 47 c=a; 48 } 49 printf("%d",c); 50 break; 51 } 52 return 0; 53 }