一.题目链接:

CodeForces-612C

二.题目大意:

定义有以下 4 种配对方式 : ( ) 、[ ] 、{ } 、< >.

一个字符串中如果每一个字符都有配对,则称之为 RBS.

若 s1 为 RBS,则 <s1>s2,  {s1}s2,  [s1]s2,  (s1)s2 也为 RBS.

三.分析:

将左字符压入栈,然后与后面的第一个右字符匹配即可.

详见代码.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define PI acos(-1.0)
#define ll long long int
using namespace std;

int main()
{
    string s;
    cin >> s;
    stack <char> st;
    int len = s.size();
    int ans = 0;
    for(int i = 0; i < len; ++i)
    {
        if(s[i] == '[' || s[i] == '(' || s[i] == '<' || s[i] == '{')///将左符号压入栈
            st.push(s[i]);
        else if(st.empty())
        ///如果还未遍历到最后一个字符,但已经没有左符号可以与这个右字符配对了
        {
            printf("Impossible\n");
            return 0;
        }
        else
        {
            char t = st.top();
            st.pop();
            if(!(t == '[' && s[i] == ']' || t == '{' && s[i] == '}' || t == '(' && s[i] == ')' || t == '<' && s[i] == '>'))
                ans++;
        }
    }
    if(st.size())///遍历完所有字符但还有左字符未配对
        printf("Impossible\n");
    else
        printf("%d\n", ans);
    return 0;
}