从前往后进行括号匹配。
如果匹配到,就把当前位置,和被匹配的括号的位置标记为对应括号的位置。
然后一段连续的不带0的区域即时一个可用的子串。
然后从这些字串中寻找中括号最多的字串。
#include <stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#include<stack>
#define LL long long
using namespace std;
int a[200000];
int num[200000];
int b[200000];
int vis[200000];
stack<int>sta;
stack<int>stb;
char str[200001];
int main()
{
int i,n,k;
while(~scanf("%s",str))
{
memset(num,0,sizeof(num));
memset(b,0,sizeof(b));
int len=strlen(str);
for(i=0; i<len; i++)
{
if(str[i]=='(')a[i+1]=1;
if(str[i]=='[')
{
a[i+1]=2;
num[i+1]++;
}
if(str[i]==')')a[i+1]=3;
if(str[i]==']')a[i+1]=4;
num[i+1]+=num[i];
}
while(!sta.empty())sta.pop();
while(!stb.empty())stb.pop();
for(i=1; i<=len; i++)
{
if(a[i]<=2)
{
sta.push(a[i]);
stb.push(i);
}
else
{
if(sta.empty())
{
continue;
}
int xx,yy;
xx=sta.top();
sta.pop();
yy=stb.top();
stb.pop();
if(xx%2==a[i]%2)
{
b[i]=yy;
b[yy]=i;
}
else
{
while(!sta.empty())sta.pop();
while(!stb.empty())stb.pop();
}
}
}
/* for(i=1;i<=len;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;*/
int maxx=0;
int ma=0;
int st=-1;
int ed=-1;
int ss=1;
for(i=1;i<=len+1;i++)
{
if(b[i]==0)
{
if(maxx<ma)
{
maxx=ma;
ed=i-1;
st=ss;
}
ss=i+1;
ma=0;
}
else
{
if(a[i]==2)ma++;
}
}
cout<<maxx<<endl;
if(maxx>0)
{
for(i=st;i<=ed;i++)
{
printf("%c",str[i-1]);
}
cout<<endl;
}
}
return 0;
}