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

Codeforces 612C Replace To Make Regular Bracket Sequence 【stack】

2016-01-12 17:47 489 查看
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.

Sample test(s)

input
[<}){}


output
2


input
{()}[]


output
0


input
]]


output
Impossible


题意:给定一个只有'{' '[' '(' '<'开字符和'}' ']' ')' '>'闭字符的字符串,你可以将开字符互相转化,闭字符互相转化,要求得到一个括号匹配的串。若可以输出最少转化次数,反之输出Impossible。

思路:stack直接搞就OK了。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <string>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define MAXN (1000000+10)
#define MAXM (200000+10)
#define Ri(a) scanf("%d", &a)
#define Rl(a) scanf("%lld", &a)
#define Rf(a) scanf("%lf", &a)
#define Rs(a) scanf("%s", a)
#define Pi(a) printf("%d\n", (a))
#define Pf(a) printf("%.2lf\n", (a))
#define Pl(a) printf("%lld\n", (a))
#define Ps(a) printf("%s\n", (a))
#define W(a) while(a--)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define MOD 1000000007
#define LL long long
#define lson o<<1, l, mid
#define rson o<<1|1, mid+1, r
#define ll o<<1
#define rr o<<1|1
#define PI acos(-1.0)
#define first fi
#define second se
using namespace std;
bool judge(char op){
return op == '(' || op == '{' || op == '<' || op == '[';
}
bool match(char op1, char op2){
bool a = op1 == '(' && op2 == ')';
bool b = op1 == '{' && op2 == '}';
bool c = op1 == '<' && op2 == '>';
bool d = op1 == '[' && op2 == ']';
return a || b || c || d;
}
char str[MAXN];
stack<int> S;
int fp[MAXN];
int main()
{
Rs(str); int len = strlen(str);
bool flag = true;
for(int i = 0; i < len; i++)
{
if(judge(str[i]))
S.push(i);
else
{
if(S.empty())
{
flag = false;
break;
}
int j = S.top();
fp[j] = i;
fp[i] = j;
S.pop();
}
}
if(!S.empty() || !flag)
printf("Impossible\n");
else
{
int ans = 0;
for(int i = 0; i < len; i++)
{
if(judge(str[i]))
if(!match(str[i], str[fp[i]]))
ans++;
}
Pi(ans);
while(!S.empty()) S.pop();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: