Codeforcesラウンド#626(DIV。2、情報モスクワオープンオリンピックに基づく)/ CF1323 C.異常大会(スタック/マッチングブラケット)

 

括弧配列は、正確な(通常の)それから「+」と「1」あなたが得ることができるだけでなく、形成された数式を挿入している場合と呼ばれています。例えば、配列" (())()"、 " ()"と" (()(()))" "が、正しい()"、 " (()"と「(()))( "ではありません。

教師はドミトリーのクラスに非常に奇妙なタスクを与えた - 彼女は唯一の開閉ブラケットからなる、任意の長さのシーケンスを思い付くすべての学生に尋ねました。その後、すべての学生は、彼らが発明したシーケンスを命名ターンを取りました。ディマの順番が来たとき、彼は突然、すべての彼のクラスメートが正しい括弧付きシーケンスを得たことに気づき、そして彼は正しい括弧付きシーケンスを持っているかどうか、彼は知りませんでした。

ディマは、彼は単にので、今、彼は少し彼の順序を変更することで、状況を保存しようと、タスクの文の単語「正しい」を逃したことを今疑います。より正確には、彼ができ、任意の回数(おそらくゼロ)が行うリオーダー動作を制御します。

リオーダー動作は配列の任意の連続したサブセグメント(サブストリング)を選択した後、任意の方法でそれのすべての文字を並べ替えるから成ります。このような動作は、かかるリットルリットルナノ秒、Lの Lはサブセグメントの長さは、並べ替えされています。これは、再注文操作は、開口部の数と閉じ括弧を変更しないことを確認するのは簡単です。「の例))((」彼は「部分文字列を選択することができます()」と再発注を行う「)()(」(この操作はかかります2 2ナノ秒)。

ディマはすぐに答えを持っていますので、彼は速く、できるだけ彼のシーケンスが正しいしたいと考えています。彼はこれを行う、またはそれが不可能だと判断するのに役立ちます。

入力

最初の行は、単一の整数含有N、N(1 N 10 6ディマの配列の長さ- 1≤n≤106を)。

2行目は、長さの文字列を含んでいるN、N、「文字から成る(」と「のみ)」。

出力

単一の整数を印刷する-ナノ秒の最小番号が正しいか、順序を作るために「-1」、そうすることは不可能である場合。

入力
コピー
8 
))((())(
出力
コピー
6
入力
コピー
3 
(()
出力
コピー
-1 
効果は何倍系列リオーダマッチングが正当ブラケットように操作することができ、ブラケットシーケンスを与えることです。各リオーダー動作のために、そのような括弧間隔任意で[L、R]が(注左右括弧の数を変更しない)の順序を変更すること、それがR-L + 1のために要する時間は、マッチングブラケットが正当にするために求め、次いで、最小コストでありますどのくらいの。
それは持っている必要があります括弧の数が等しいについては、この操作は理にかなっているように、まず第一に、すべてのリオーダー選択された間隔のために、知っているかもしれません。そう思うことがあり、あなたがそのような順序があることを仮定してもよい:(....約4ポイントの期間は、括弧内の数字に等しいので、括弧内のすべての数字は全体の範囲を表していることを再発注した後、その4つのポイントに等しくない、間隔を表します。法律上、単独で、または出会いの範囲その左括弧、右括弧、これは意味がありません(その4点の間隔ダイレクトリオーダーなど)、または出会い左括弧(まだ違法)、ので。(形而上学の理解)は、
第1のプレフィックスと括弧に等間隔かどうかについて判断の形を持つすべて、次いでマッチングブラケットの伝統的な考え方を使用する、POSは新しいスタックがに直接空のブラケットである場合、電流が発生し、左点間隔の順序を変更する必要があるかもしれません表しますそれが一致しない場合、スタックセットのpos私は、私+ 1スタックは、POSを置くために設定され、この時点では空である場合には、第1ブラケットと現在と一致するように、ブラケットが、その後、スタックを削除できるかどうかを確認するには、空のスタックではありません直接現在のスタックへのブラケットのブラケットの数。POSは、iが等しい期間に等しい時間間隔をチェックし、空でないスタック(何かを削除することができる)、その後、更新 そして、スタックケース、リセットPOS。空に
も注目すべき違法の大規模な範囲は、法律上の部分の小さなセクションが含まれているため、その後、まだ全体の大きな範囲を並べ替えるために持っている、ということを。
#include <ビット/ STDC ++ H.>
 使用して 名前空間STD;
 int型N-;
 チャー A [ 1000005 ];
 INT SUM [ 1000005 ] = { 0 }; // 左ブラケット1、右ブラケット-1 
スタック< チャー > S。
 INT ANS = 0 ;
 int型のmain()
{ 
    CIN >> N-;
     INT I; 
    scanfの(" %のS " 、A);
     INT POS = 1 ; 
     のために(私は= 1 ; I <= N; I ++ 
    { 
        場合([I- 1 ] == ' ' 
        { 
            和[I] = 1 ; 
        } 
        
        { 
            和[I] = - 1 ; 
        } 
        もし(I == 1 
        { 
            s.push([ 0 ]);
             続ける; 
        } 
        和[I] + =和[I- 1 ];
         もし(s.size()== 0 
        { 
            POS = I。
            s.push([I- 1 ])。
            続け; 
        } 
        であれば(s.top()== ' ' && [I- 1 ] == ' ' 
        { 
            s.pop()。
            もし(s.size()== 0)POS = I + 1 
        } 
        
        { 
            s.push([I - 1 ])。
        } 
        もし(和[I] -sum [POS- 1 ] == 0 && s.size())
        { 
            ANS + =(I-POS + 1 )。 
            POSは = I +は1 ;
            一方、(s.size())s.pop(); 
        } 
    } 
    もし(和[N] -sum [ 0 ]!= 0)COUT << - 1 << ENDL。
    他の coutの<< ANS << てendl;
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/lipoicyclic/p/12442536.html