/*
zoj_2704 模拟
用栈模拟。感觉题目说得不是很清楚,wa了数次才过。。
[][]()()这种数据是整串输出的。
*/
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
using namespace std;
struct node
{
int id,len;
char v;
};
stack <node>s;
int num[100010];//num[i]表示以序号i开始可以得到的最长regular brackets sequence.
int main()
{
string str,ss;
int i,len,mark;
node temp,t;
while( cin>>str )
{
memset( num,0,sizeof(num) );
for( i=0;i<str.size();i++ )
{
switch( str[i] )
{
case '(':
case '[':
temp.id=i;
temp.len=0;
temp.v=str[i];
s.push( temp );
break;
case ')':
if( s.empty() ) continue;
t=s.top();
if( t.v=='(' )
{
t.len++;
num[ t.id ]=t.len;
s.pop();
if( !s.empty() ) s.top().len+=t.len;//这里容易写错
}
else//不匹配清空栈
{
while( !s.empty() )
s.pop();
}
break;
case ']':
if( s.empty() ) continue;
t=s.top();
if( t.v=='[' )
{
t.len++;
num[ t.id ]=t.len;
s.pop();
if( !s.empty() ) s.top().len+=t.len;
}
else
{
while( !s.empty() )
s.pop();
}
break;
}
}
len=0; ss="";
for( i=str.size()-1;i>=0;i-- )
if( i+2*num[i]<=str.size()-1 )
num[i]+=num[ i+2*num[i] ];
for( i=0;i<str.size();i++ )
{
if( num[i]>len )
{
mark=i;
len=num[i];
}
}
if( len!=0 )
for( i=mark;i<mark+2*len;i++ )
ss+=str[i];
cout<<ss<<endl<<endl;
while( !s.empty() ) s.pop();
}
return 0;
}
zoj 2704 Brackets
最新推荐文章于 2016-04-26 22:11:36 发布