You are given string s consists of opening and closing brackets of four kinds <>, {}, [], (). There are two types of brackets: opening and closing. You can replace any bracket by another of the same type. For example, you can replace < by the bracket {, but you can't replace it by ) or >.
The following definition of a regular bracket sequence is well-known, so you can be familiar with it.
Let's define a regular bracket sequence (RBS). Empty string is RBS. Let s1 and s2 be a RBS then the strings <s1>s2, {s1}s2, [s1]s2,(s1)s2 are also RBS.
For example the string "[[(){}]<>]" is RBS, but the strings "[)()" and "][()()" are not.
Determine the least number of replaces to make the string s RBS.
The only line contains a non empty string s, consisting of only opening and closing brackets of four kinds. The length of s does not exceed 106.
If it's impossible to get RBS from s print Impossible.
Otherwise print the least number of replaces needed to get RBS from s.
[<}){}
2
{()}[]
0
]]
Impossible
#include <cmath> #include <queue> #include <stack> #include <cstdio> #include <cstring> #include <algorithm> #define MAX_N 1000005 using namespace std; const int INF = 0xffff; char s[MAX_N]; //用数组将每种括号存储下来,对于判断括号的类型就可以借助数组下标,比较方便 char c[] = {'<', '>', '(', ')', '{', '}', '[', ']'}; int main() { stack<char> stk; while (scanf("%s", s) != EOF) { while (!stk.empty()) stk.pop(); int ans = 0; int len = strlen(s), k, m, n; for (int i = 0; i < len; i++) { if (!stk.empty()) { //查找字符在数组中的下标,确定字符的类型 for (k = 0; k < 8; k++) { if (stk.top() == c[k]) m = k; if (s[i] == c[k]) n = k; } //类型不同并且出栈元素为左边的括号才可以出栈 if (m%2 != n%2 && !(m%2)) { if (m != n - 1) ans++; stk.pop(); } else stk.push(s[i]); } else stk.push(s[i]); } if (stk.empty()) printf("%d ", ans); else printf("Impossible "); } return 0; }