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
遍历s,遇到左括号则进栈,遇到右括号则取栈顶元素出来判断两个括号是否匹配,不匹配修改次数加一,在遍历的过程中记录res=左括号数量-右括号数量,如果在遍历过程中出现res<0的情况或者在遍历完后res!=0则说明左右括号不匹配输出Impossible,否则存在合理修改方案输出修改次数即可
Code
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 1111111
char c[maxn],s[maxn];
int res,ans;
int main()
{
while(~scanf("%s",c))
{
res=ans=0;
int len=strlen(c);
for(int i=0;i<len;i++)
{
if(c[i]=='{'||c[i]=='['||c[i]=='('||c[i]=='<')s[++res]=c[i];
else
{
if(c[i]!=s[res]+1&&c[i]!=s[res]+2)ans++;
res--;
}
if(res<0)break;
}
if(res) printf("Impossible\n");
else printf("%d\n",ans);
}
return 0;
}