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

Description
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.

Sample Input
Input
[<}){}
Output
2
Input
{()}[]
Output
0
Input
]]
Output

Impossible

题意:括号配对问题,这里你可以将相同方向的括号换成别的括号,最后如果能配对输出换了多少个,如果不能输出Impossible;

思路:栈,遇到左边的括号进栈并保存有多少个,遇到右边的判断与最后一个进栈的是否配对如果配对则ans-1。这里需要注意的是有可能左边多了或者右边多了这时可以判断栈是否为空 如果为空 则在输入右边的就Impossible 如果不为空 最后判断时 可以知道 有左边的没有配对成功 输出Impossible

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<string.h>
using namespace std;
char a[1000011];
int main()
{
	while(~scanf("%s",a))
	{
	int t=strlen(a);
	if(t%2!=0)
	printf("Impossible\n");
	else
	{
		stack<char >sta;
		int ans=0,p=0;
		for(int i=0;i<t;i++)
		{
			if(a[i]=='{'||a[i]=='['||a[i]=='('||a[i]=='<')
			{
			sta.push(a[i]);
			ans++;	
			}
			else
			{
				if(sta.empty())
				{
					p++;
					printf("Impossible\n");
					break;
				}
				else
				{
				char s=sta.top();
				if((s=='{'&&a[i]=='}')||(s=='('&&a[i]==')')||(s=='['&&a[i]==']')||(s=='<'&&a[i]=='>'))
				{
					ans--;
				}
				sta.pop();	
				}
		}
		}
		if(p==0)
		{
		if(sta.empty())
		{
		if(ans<0)
		printf("Impossible\n");
		else
		printf("%d\n",ans);		
		}
		else
		printf("Impossible\n");
		}
	}
	memset(a,0,sizeof(a));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值