zoj 2704 Brackets
来源:互联网 发布:代理模式java有几种 编辑:程序博客网 时间:2024/05/21 19:45
/*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;}