括弧改善_NOIガイド2009年P1944最長一致
問題の解決策
私は何かの魚があったことを信じることを好む、ちょうどいくつかの谷のタイトルタグを信じることができません
私は長い間考えた後、問題のチラリソリューションは、シミュレート十分にスタックしてい
[i]はフラグが使用に一致されているかどうか、BOOL配列を使用する必要があり、シミュレートするスタック
トピックが必要なので、ブラケットの束、スタック、ポップアップ最初の試合に、マークは、行の最大の罰金、その後、試合の最後のピックを一致したサブストリング
二つの点に注意してください。
参照番号は、トップ1.Q [トップ]配列は括弧内に格納された括弧書きの符号を格納し、されていないいます
一時的にどのように多くの試合連続、括弧の合計数を記録2.res、新しいブラケットに直面したときに再び更新されます
特定のコードを組み合わせてもよいです
コード
書式#include <iostreamの> の#include <cstdioを> する#include <cstdlib> 書式#include <アルゴリズム> 書式#include <cmath> の#include < 文字列 > の#include <CStringの> の#include <キュー> 使用して名前空間はstdを、 typedefの長い長いLL。 インラインint型リード() { int型 ANS = 0 。 チャー最後=を' '、CH = GETCHAR()。 しばらく(CH < ' 0 ' || CH> 9 ')最後= CH、CH = GETCHAR()。 一方、(CH> = ' 0 ' && CH <= ' 9 ')ANS = ANS * 10 + CH- ' 0 '、CH = GETCHAR()。 もし(最後== ' - ')ANS = - ANS; 戻り値は、ANS; } CONST INT MAXN = 1E6 + 10 。 チャーS [MAXN]。 ブール使用[MAXN]。 int型のトップ= 0 、Q [MAXN]。 INT L、R、ANS = 0、RES = 0、L1 = 0、R1 = 0 。 INT メイン() { scanf関数(" %S "、S + 1 )。 INT LEN = STRLEN(S + 1 )。 memsetの(使用、0、はsizeof (使用))。 以下のために(INT iが= 1 ; I <= LEN; I ++ ){ もし、((S [ Q [トップ] ] == ' (' && S [I] == ' )')||(S [ Q [トップ] ] == ' [ ' && S [i]を== "] ' )){ 使用[Q [ トップ - ] = 1 。 使用[I] = 1 。 } 他{ Q [ ++トップ] = I。 } } のために(INT iは= 1 ; I <= LEN; I ++ ){ 場合(!使用[I]){ 場合(RES> ANS)ANS = RES、L = L1、R = R1。 RES = 0 ; //不可以放到里面なら } 他{ 場合(RES == 0)L1 = R1 = I; 他 R1 ++ ; RES ++ ; //配置されていない場合に内部 } } もし(RES> ANS)ANS = RES、RES = 0、L = L1 = R&LT R1; のため(int型 I L =; I <= R&LT; I ++)のprintf(" %のC " 、S [I]); 戻り 0 ; }
Aハンクは彼自身を開始し、その後ハンク自身SIました
1。())[]())[]
2。())]([(] [()]]()