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;}

原创粉丝点击