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
[<}){}
2
{()}[]
0
]]
Impossible
题意:给一个由括号组成的集合,问是否有可能改变(改变规则:左括号只能改为其他的左括号,右括号只能改为其他的右括号)其中的几个符号能使这个集合变成RBS.
用一个栈来放入没有匹配的左括号,如果按顺序遇到一个右括号,则看这个右括号是否和栈顶元素匹配,如果匹配,栈顶元素出栈,如果不匹配,ans+1,栈顶元素出栈..以此类推,如果到最后栈不为空,则为没有匹配完,输出Impossible.
代码如下:
#include<stdio.h> #include<string.h> #include<stack> #include<algorithm> using namespace std; char str[1000100]; char fun(char x) { if(x=='{') return '}'; if(x=='(') return ')'; if(x=='[') return ']'; if(x=='<') return '>'; return 0; } int main() { scanf("%s",str); stack<char>st; int n=strlen(str); int i,ans=0; for(i=0;i<n;i++) { if(str[i]=='<'||str[i]=='{'||str[i]=='('||str[i]=='[') st.push(str[i]); else if(!st.empty()) { if(fun(st.top())!=str[i]) ans++; st.pop(); } else { printf("Impossible\n"); return 0; } } if(!st.empty()) { printf("Impossible\n"); } else printf("%d\n",ans); return 0; }