スタック(ブラケットマッチング、テレビのイルカ、フィーディングフレンジー)



Stack Bracket Matching



スピードダウン、コロンブー!!!
手漕ぎコーチ、ガビ
常識が示すように、競争力のあるプログラマーはボート漕ぎに優れています。オリンピックレーンは、漕ぎ、走り、運動するのに最適な場所です。この地域に生息するカピバラは、時間をかけて鑑賞する人はほとんどいません。カピバラは魅力的な動物です!彼らの美しさは別として、彼らは多くの興味深い行動を持っています。カピバラは100個体もの群れで生活できることをご存知ですか?

晴れた朝、ヤンはいつものように走っていた。カピバラを見て、彼は彼らが日光浴に並ぶことに気づきました。各カピバラは別のカピバラとペアになっていて、別のカピバラだけがペアになっています。 2つのカピバラは、両方がお互いを見る場合にのみペアにすることができます。カピバラは、見ている方向にすべてを見ています。



不思議なことに、ヤンはカピバラを文字AとBで表すことにしました。ここで、Aはカピバラが右を向いていることを示し、Bはカピバラが左を向いていることを示します。

たとえば、シーケンスAABABBは、上記のルールに従ってすべてのカピバラをペアリングできるため、日光浴をしているカピバラを正確に表します。ヤンはこれにとても魅了されていたので、彼は水に滑り込んで感じ、彼の表現を台無しにしました。彼はいくつかを回復することができました、しかし今それらはすべてお互いに台無しにされています。彼を助けて、与えられたシーケンスがカピバラの日光浴を表しているかどうかを調べることができますか?



入力
すべてのインスタンスには、「A」と「B」(ヤンの表現)のみで構成される文字のシーケンスSが含まれています。 1≤| S |と仮定することができます≤105。

出力
出力には1行が含まれている必要があります。シーケンスがカピバラの日光浴を表す場合は「Sim」を印刷し、それ以外の場合は「Nao」を印刷します。


入力
AABABB
出力
はい
アイデア:
この問題は、実際には角かっこタイトルタイプと一致しています。Aが左括弧を表す場合、Bが右括弧を表す場合、この問題は通常、スタックとペアになります。彼の考えは、文字列を直接操作するスタックではないことから始まります。真ん中はABではないものを確認することです。これが間違ったドロップであることは明らかです。反対の例です。AAABBBは使用された単語のスタックで証明できます。注意が必要です。今回はBであり、aは左を向いているためBAは機能しません。右に対応する外観 ')('ケース
収益はスタックに遭遇し、上面Bは、電流がAでないかどうかを判断し、終了しません。次に、スタックが空の場合、Aがトップトップファイナルルックにある場合、電流も終了します。スタックについては空ではありません、空ではありません正しくありません



#include #include #include #include char s[100001] using namespace std queue<char>q int main() { scanf('%s',s) int len=strlen(s) int f=0 for(int i=0iif(s[i]=='A') { q.push(s[i]) } else if(s[i]=='B') { if(q.size()==0||q.front()!='A') { f=1 break } else q.pop() } } if(q.size()!=0)f=1 if(f==1)printf('Nao ') else printf('Sim ') return 0 }

4つのキュースタックの実験データ構造:一致する角かっこ
制限時間:1000ミリ秒メモリ制限:65536 KiB

問題の説明
角かっこ、数字、文字、句読点、スペースを含む50文字以下の文字列を提供するには、()、[]、{}の文字列が一致することを確認する必要があります。

入力
入力データの複数のセット、ファイルの終わりまでの処理。

出力
一致が「はい」を出力する場合、出力は「いいえ」と一致しません

サンプル入力
なし(20 + 10)
{[}]
サンプル出力
はい
しない
ヒント
ソース
ma6174
アイデア:
左角かっこを押して、右括弧がスタックの現在の一番上が対応する左括弧ではないと判断した場合、終了せず、スタックから外れ、さらにスタックが空ではないか、空であるかを確認します最終的な総判断をやめる

#include #include #include #include char s[100] using namespace std stack<char>q int main() { while(gets(s)!=NULL)// spaces may not use% s { int len=strlen(s) int f=0 for(int i=0 iif(s[i]=='{'||s[i]=='('||s[i]=='[') { q.push(s[i]) // printf('top==%c ',q.top()) } else if(s[i]=='}'||s[i]==')'||s[i]==']') { if(q.size()==0) { f=1 break } // printf('%c111 ',q.top()) if((s[i]=='}'&&q.top()!='{')||(s[i]==']'&&q.top()!='[')|| (s[i]==')'&&q.top()!='(')) { f=1 break } else if((s[i]=='}'&&q.top()=='{')||(s[i]==']'&&q.top()=='[')|| (s[i]==')'&&q.top()=='(')) { q.pop() } } } if(q.size()!=0)f=1 if(f==0)printf('yes ') else printf('no ') while(!q.empty())q.pop() } return 0 }

F-狂乱の餌やり(20)
N匹の魚は、それぞれの魚の位置とサイズが異なり、X軸に沿って歩き、一部は左に、一部は右に歩きます。遊泳速度は同じで、2匹の魚が大きな魚に出会って小さな魚を食べます。左から右へ、各魚の遊泳方向のサイズを指定します(左側は0を表し、1は右側を表します)。尋ねるのに十分長い時間の後、何匹の魚が休むことができますか?
入力
1行目:1数N、魚の数(1<= N <= 100000).
の2-N + 1行:それぞれスペースで区切られた行番号Ai、Biごとに2つ、および(1の方向に泳ぐ魚のサイズ<= Ai <= 10 ^ 9, Bi = 0 or 1, 0 indicates the left, 1 indicates the right).
出力
出力番号1は、最終的に残っている魚の数を表します。
サンプル入力
5
4 0
3 1
20
1 0
50
サンプル出力

#include #include #include #include #include using namespace std stack<int>q int main() { int n,num scanf('%d',&n) num=n for(int i=1i<=ni++) { int a,b scanf('%d%d',&a,&b) if(b==1)q.push(a)// long as it is right on the stack else { while(!q.empty()) { if(q.top() // comparison with the left, a large, you can put inside the stack of fish if left to eat, and then eat it // eaten at a relatively, even to the next is a right, does not matter, because the 'left, right' the two of them would not meet { q.pop() num--// if the left is small, it is the stack of fish to eat, the total number of -1, continue to the next comparison } else { num-- break } } } } printf('%d ',num) return 0 }