题解 P1944 【最长括号匹配_NOI导刊2009提高(1)】
话说为什么这题是提高+/省选
真是一道水积分的好题~~~
我们直接一个一个压进栈里,把匹配的都弹出去,然后记vis数组vis[i]表示i位是不是成功匹配了
然后找vis数组中最长的一段vis[i]=1的直接输出就好了
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#define siz 1000100
using namespace std;
int la,top,cnt,l,ansl,ansr,ans;
int sta[siz][2];
char a[siz];
bool vis[siz];
int main(){
scanf("%s",a);
la=strlen(a);
for(int i=0;i<la;++i)
if((sta[top][0]=='['&&a[i]==']')||(sta[top][0]=='('&&a[i]==')')) vis[sta[top--][1]]=vis[i]=1;
else sta[++top][0]=a[i],sta[top][1]=i;
for(int i=0;i<la;++i)
if(!vis[i]) cnt=0,l=i+1;
else {
cnt++;
if(cnt>ans) ansl=l,ansr=i,ans=cnt;
}
for(int i=ansl;i<=ansr;++i) putchar(a[i]);
return 0;
}
O(n)过