您的位置:首页 > 产品设计 > UI/UE

Codeforces 612C Replace To Make Regular Bracket Sequence【栈】

2016-07-26 22:45 477 查看
Replace To Make Regular Bracket Sequence

time limit per test
1 second

memory limit per test
256 megabytes

input
standard input

output
standard output

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.

Input

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.

Output

If it's impossible to get RBS from s print Impossible.

Otherwise print the least number of replaces needed to get RBS from s.

Examples

input
[<}){}


output
2


input
{()}[]


output
0


input
]]


output
Impossible


这是栈的括号配对问题,就像南阳OJ的题型,但是不同的是这道题中,不同类型的括号还可以互换,而且要是可以全部出栈,输出替换的次数。
#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\n", ans);
else printf("Impossible\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm codeforces