CH1801括號畫家

mac2022-06-30  22

題目描述:

达达是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。

这一天,刚刚起床的达达画了一排括号序列,其中包含小括号( )、中括号[ ]和大括号{ },总长度为N。

这排随意绘制的括号序列显得杂乱无章,于是达达定义了什么样的括号序列是美观的:

(1) 空的括号序列是美观的;

(2) 若括号序列A是美观的,则括号序列 (A)、[A]、{A} 也是美观的;

(3) 若括号序列A、B都是美观的,则括号序列AB也是美观的。

例如 (){} 是美观的括号序列,而)({)[}]( 则不是。

现在达达想在她绘制的括号序列中,找出其中连续的一段,满足这段子序列是美观的,并且长度尽量大。

數據範圍:

字符串长度不超过100000。


解析:

思路1:在常見括號匹配的模板中,記錄一下棧的top值,找出距離最遠的相同的top值。

弊端:(}}}}}})不能很好避免。

正解:將右括號也加入棧,左括號入棧時記錄其在字符串中的位置,匹配成功時只需將左括號所在位和右括號所在位設為星號,最後統計最長星號連續長度即可


代碼:

#include<bits/stdc++.h> using namespace std; char s[100003],buf[100003]; int p[100003],ans,tp; bool is[100003]; int main() { scanf("%s",buf); int len=strlen(buf); for(int i=0;i<len;++i) { if(!tp) {s[++tp]=buf[i];p[tp]=i;} else switch(buf[i]) { case ')': if(s[tp]=='(') is[i]=is[p[tp--]]=1; else s[++tp]=buf[i]; break; case ']': if(s[tp]=='[') is[i]=is[p[tp--]]=1; else s[++tp]=buf[i]; break; case '}': if(s[tp]=='{') is[i]=is[p[tp--]]=1; else s[++tp]=buf[i]; break; default: s[++tp]=buf[i]; p[tp]=i; break; } } int ans=0,p=0; for(int i=0;i<len;++i) if(is[i]&&is[i+1]) ans=max(ans,++p); else p=0; if(ans) cout<<ans+1; else cout<<0; return 0; } //({({(({()}})}{())})})[){{{([)()((()]]}])[{)]}{[}{)

转载于:https://www.cnblogs.com/tztqwq/p/11347424.html

最新回复(0)