题目链接:http://codeforces.com/problemset/problem/612/C
题意:有4对类型的括号,可以将左括号变成另一类型的左括号,可以将右括号变成另一类型的右括号,问最少变多少次可以括号可以匹配,不可以输出-1
思路:利用栈做括号匹配就可以了,失配的时候将一个右括号转换下类型res++,最后栈清空了就匹配完成
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
using namespace std;
stack <char>stk;
char s[1000030];
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
while (!stk.empty())
stk.pop();
scanf("%s",&s);
int len=strlen(s),res=0,flag=1;
for (int i=0;i<len;i++)
{
if (s[i]=='(' || s[i]=='{' || s[i]=='<' || s[i]=='[')
stk.push(s[i]);
else if (s[i]==')')
{
if (stk.size()!=0)
{
char tmp=stk.top();
stk.pop();
if (tmp!='(') res++;
}
else
{
flag=0;
}
}
else if (s[i]=='}')
{
if (stk.size()!=0)
{
char tmp=stk.top();
stk.pop();
if (tmp!='{') res++;
}
else
{
flag=0;
}
}
else if (s[i]==']')
{
if (stk.size()!=0)
{
char tmp=stk.top();
stk.pop();
if (tmp!='[') res++;
}
else
{
flag=0;
}
}
else if (s[i]=='>')
{
if (stk.size()!=0)
{
char tmp=stk.top();
stk.pop();
if (tmp!='<') res++;
}
else
{
flag=0;
}
}
}
if (flag && stk.size()==0)
printf("%d\n",res);
else
printf("Impossible");
}
}