ああ...
トピックリンクします。https://www.luogu.org/problem/P1241
まず、この質問だけではなく、あなたがブラケットシーケンスの合法性を判断したい、あなたは補完的なこのシーケンスを完了する必要があります、スタックエントリの質問の拡張バージョンです...
始まりは突然実現TJを見た後、何の手がかりはありません...
アイデア:
我々は、すべてのブラケットが、その後、私たちは、左ブラケットに対処するために、ゼロから再び掃引一致しなかったことを、正当でない比較的簡単であることを前提としています。
すべての添字qは左側ブラケットスタックに格納され、その後、配列bに格納されている全てに対応するブラケットと右ブラケットを残しています。
次に、より複雑な処理右括弧のために:
前回の試合は括弧を残しているか、スタックの左括弧のトップが一致しない場合、右のブラケットには他の試合、すなわち、配列に対応する位置はカッコbを入れると一致しました。試合はその後、クリア右括弧配列bに格納されている場合。
オーダーの出力に注意してください...
ACコード:
1の#include <cstdioを> 2の#include <iostreamの> 3の#include <CStringの> 4 5 使用 名前空間STD。 6 7 チャー S [ 105 ]、B [ 105 ]。 8 int型 Q [ 105 ]、CNT。 9 10 INT メイン(){ 11 のscanf(" %sの" 、S); 12 INTのL =のSTRLEN(S) 13 のためには、(int型 = Iを0 ; iはLを<; iは++ ){ 14 もし(S [I] == ' ('){Q [++ CNT] = I; B [I] = ' )'。継続}; 15 場合(S [I] == ' [ '){Q [++ CNT] = I。B [I] = ' ] '。引き続き;} 16 場合(S [I] == ' )' || S [i]が== ' ] ' ){ 17 であれば(!B || CNT [Q [CNT]]!=のS [I]){ 18 であれば(S [I] == ' )' B)[I] = ' (' 。 19 他 [I] = B ' [ ' 。 20 } 21 他 B [Q [cnt--] = ' ' ; 22 } 23 } 24 のためには、(int型 i = 0 ; iはL <; iは++ ){ 25 であれば(B [I] == ' (' || B [I] == ' [ ')のprintf(" %のC " 、 B [i])と、 26 のprintf(" %のC " 、S [i])と、 27 であれば(B [I] == ' )' || B [i]は== ' ] ')のprintf(" %のC " 、B [I])。 28 } 29 リターン 0 。 30 }