一.题目链接:
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;
}