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

Codeforces 612C: Replace To Make Regular Bracket Sequence(栈)

2016-07-26 00:00 597 查看
C. 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

题目大意:括号匹配的变形题,在这里只要是左括号,就能跟右括号消掉,但是消掉前得把左括号变成和右括号一样的才能消掉,问给你一个字符串,匹配的时候需要将左括号变几次,如果不能消掉,则输出Impossible。
解题思路:跟括号匹配差不多,就是多了几个条件。
代码如下:
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
char a[1000010];
int main()
{
scanf("%s",a);
int size=strlen(a);
stack<char>q;
int cnt=0;
for(int i=0;i<size;i++)
{
if(q.empty())
{
q.push(a[i]);
}
else
{
if((q.top()=='<'&&(a[i]=='>'||a[i]==')'||a[i]=='}'||a[i]==']'))||(q.top()=='('&&(a[i]=='>'||a[i]==')'||a[i]=='}'||a[i]==']'))||(q.top()=='{'&&(a[i]=='>'||a[i]==')'||a[i]=='}'||a[i]==']'))||(q.top()=='['&&(a[i]=='>'||a[i]==')'||a[i]=='}'||a[i]==']')))//左括号碰到了右括号
{
if((q.top()=='<'&&a[i]=='>')||(q.top()=='('&&a[i]==')')||(q.top()=='{'&&a[i]=='}')||(q.top()=='['&&a[i]==']'))//如果左右括号是同类的,那么直接消掉
{
q.pop();
}
else
{
cnt++;//不同类的,消掉前,变数+1
q.pop();
}
}
else//左右括号不同类,加入栈
{
q.push(a[i]);
}
}
}
if(q.empty())//如果最后匹配消掉成功,则栈一定是空的
printf("%d\n",cnt);
else
printf("Impossible\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: