#18. 括号画家——Yucai OJ第16次测试
Posted vocaoid
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#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
标程:
#include<bits/stdc++.h>
const int N=10005;
int hj[N];
char s[N];
int kh(char c){
if(c==‘(‘){
return 1;
}else if(c==‘)‘){
return -1;
}else if(c==‘[‘){
return 2;
}else if(c==‘]‘){
return -2;
}else if(c==‘{‘){
return 3;
}else if(c==‘}‘){
return -3;
}
return 0;
}
int main(){
int a,b,c;
while(scanf("%s",s)){
a=b=c=0;
for(int i=0;i<strlen(s);i++) {
int p=kh(s[i]);
if(p+hj[b]==0) {
a++;
b--;
}else if(p>0) {
hj[++b]=p;
a++;
}else{
if(b){
a-=b;
}
if(c<a){
c=a;
}
a=b=0;
}
}
if(b){
a-=b;
}
if(c<a){
c=a;
}
printf("%d",c);
break;
}
return 0;
}
注:原题解见huyufeifei的 https://www.cnblogs.com/huyufeifei/p/9087800.html
以上是关于#18. 括号画家——Yucai OJ第16次测试的主要内容,如果未能解决你的问题,请参考以下文章