栈的纯粹应用
sumi表示为以i为结尾的最长匹配,然后就可以考虑转移
当然每一种要单独考虑每一种的
所以3个栈
#include<bits/stdc++.h>
using namespace std;
string a;
int n,sum[100005],maxl=-1;
//sum[i]±íÊÇÒÔi½áβµÄ×ÃÀÀö×Ó´®
//Èç¹ûÆ¥ÅäÆ¥Å䣬ÔÙ¼ì²âÆ¥ÅäÇø¼äÄÚÊÇ·ñ¿ÉÒԺϲ¢
stack<int>q1,q2,q3;
int main(){
cin>>a;memset(sum,0,sizeof(sum));
n=a.size();
for(int i=0;i<n;i++){
if(a[i]=='(')q1.push(i);
if(a[i]=='[')q2.push(i);
if(a[i]=='{')q3.push(i);
if(!q1.empty()&&a[i]==')'){
if(sum[i-1]==(i-q1.top()-1)){
sum[i]=i-q1.top()+1+sum[q1.top()-1];
}
else sum[i]=0;
q1.pop();
}
else if(!q2.empty()&&a[i]==']'){
if(sum[i-1]==(i-q2.top()-1)){
sum[i]=i-q2.top()+1+sum[q2.top()-1];
}
else sum[i]=0;
q2.pop();
}
else if(!q3.empty()&&a[i]=='}'){
if(sum[i-1]==(i-q3.top()-1)){
sum[i]=i-q3.top()+1+sum[q3.top()-1];
}
else sum[i]=0;
q3.pop();
}
maxl=max(maxl,sum[i]);
}
cout<<maxl<<endl;
}