P10472 括号画家
题目描述
Candela 是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。这一天,刚刚起床的 Candela 画了一排括号序列,其中包含小括号 ()、中括号 [] 和大括号 {},总长度为 NNN。这排随意绘制的括号序列显得杂乱无章,于是 Candela 定义了什么样的括号序列是美观的:
- 空的括号序列是美观的;
- 若括号序列 A 是美观的,则括号序列
(A)、[A]、{A}也是美观的; - 若括号序列 A、B 都是美观的,则括号序列
AB也是美观的;
例如 [(){}]() 是美观的括号序列,而 )({)[}]( 则不是。
现在 Candela 想在她绘制的括号序列中,找出其中连续的一段,满足这段子序列是美观的,并且长度尽量大。你能帮帮她吗?
输入格式
第一行一个长度为 NNN 的括号序列。
输出格式
一个整数,表示最长的美观的连续子序列的长度。
输入输出样例 #1
输入 #1
({({(({()}})}{())})})[){{{([)()((()]]}])[{)]}{[}{)
输出 #1
4
说明/提示
数据保证,各个测试点的 NNN 的大小分别为:5,10,50,100,100,1000,1000,10000,10000,100005,10,50,100,100,1000,1000,10000,10000,100005,10,50,100,100,1000,1000,10000,10000,10000。
C++实现
#include<bits/stdc++.h>
#define int long long
using namespace std;
char st[114514];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string a;
int n,maxn=0;
cin>>a;
n=a.size();
for(int i=0;i<n;i++)
{
int now=0,top=0;
for(int j=i;j<n;j++)
{
if(a[j]‘(’||a[j]‘[’||a[j]‘{’)st[++top]=a[j];
if(a[j]‘)’)if(st[top]‘(’)top–,now++;else break;
if(a[j]‘]’)if(st[top]‘[’)top–,now++;else break;
if(a[j]‘}’)if(st[top]‘{’)top–,now++;else break;
if(top0)maxn=max(maxn,now*2);
}
}
cout<<maxn;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++信奥P10472普及组提高 括号画家&spm=1001.2101.3001.5002&articleId=145743961&d=1&t=3&u=0c974e8a6a6c4c689f23c2fbcffa555e)
447

被折叠的 条评论
为什么被折叠?



