トレーニング5 - Eのタイトル
あなたは、文字列sは、4種類<の開閉ブラケットから構成与えられ>、{}、[]、()。開閉:ブラケットの2種類があります。あなたは、同じタイプの別によって任意のブラケットを交換することができます。たとえば、<ブラケット{で、しかし、あなたは)またはそれを置き換えることはできません>置き換えることができます。
あなたはそれに精通していることができますので、通常のブラケットシーケンスの次の定義は、よく知られています。
のは、通常のブラケットシーケンス(RBS)を定義してみましょう。空の文字列はRBSあります。S1およびS2 RBSこと次に文字列がS2、{S1} S2、[S1] S2(S1)S2もRBSありましょう。
例えば、文字列「[[(){} <>」RBSが、ストリング「[)()」と「] [()()」ではありません。
文字列s RBSを作るために置き換えの最小数を決定します。
入力
唯一のラインはわずか4種類のブラケットを開閉なる非空の文字列sを含んでいます。Sの長さは106を超えません。
出力
それはsからRBSを取得することは不可能です場合インポッシブル印刷します。
そうでなければsからRBSを取得するために必要な置き換えの少なくとも数を印刷します。
例
入力
[<})} {
出力
2
入力
{()} []
出力
0
入力
]]
出力
不可能な
#pragma warning (disable:4996)
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define inf 0X3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 1e7 + 5;
const int maxn = 1e3 + 5;
stack<char> s;
int main()
{
string str;
cin >> str;
int ans = 0;
bool flag = 1;
for (int i = 0; i < str.size(); i++)
{
if (i == 0 || str[i] == '<' || str[i] == '{' || str[i] == '[' || str[i] == '(')
s.push(str[i]);
else
{
if (s.empty())
{
flag = 0;
break;
}
if (str[i] == '>')
{
if (s.top() == '<')
s.pop();
else if (s.top() == '{' || s.top() == '[' || s.top() == '(')
{
ans++;
s.pop();
}
else
{
flag = 0;
break;
}
}
if (str[i] == '}')
{
if (s.top() == '{')
s.pop();
else if (s.top() == '<' || s.top() == '[' || s.top() == '(')
{
ans++;
s.pop();
}
else
{
flag = 0;
break;
}
}
if (str[i] == ']')
{
if (s.top() == '[')
s.pop();
else if (s.top() == '{' || s.top() == '<' || s.top() == '(')
{
ans++;
s.pop();
}
else
{
flag = 0;
break;
}
}
if (str[i] == ')')
{
if (s.top() == '(')
s.pop();
else if (s.top() == '{' || s.top() == '[' || s.top() == '<')
{
ans++;
s.pop();
}
else
{
flag = 0;
break;
}
}
}
}
if (s.size())
flag = 0;
if (flag)
printf("%d\n", ans);
else
printf("Impossible\n");
return 0;
}
アイデア:
スタックストレージ文字は、スタックから左括弧、右括弧を押してください。