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
input
output
input
output
题意:给定一个只有'{' '[' '(' '<'开字符和'}' ']' ')' '>'闭字符的字符串,你可以将开字符互相转化,闭字符互相转化,要求得到一个括号匹配的串。若可以输出最少转化次数,反之输出Impossible。
思路:stack直接搞就OK了。
AC代码:
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; }
相关文章推荐
- iOS Version 和 Build 版本号
- iOS UITableView 滚动 头图 拉伸放大效果
- 导航条UIBarButtonItem添加图片,如何避免渲染
- UIAlertController 的使用(NS_CLASS_AVAILABLE_IOS(8_0)iOS8以后有效)
- UIview转换UIimage
- EasyUI datagrid动态加载json数据
- IOS上 关于状态栏的相关设置(UIStatusBar)
- Java集合的Stack、Queue、Map的遍历
- 自定义UINavigationItem的两种方法以及相应的隐藏方法
- HDU 1005 Number Sequence
- DIY:利用Arduino制作智能家居系统
- EasyUI Sping MVC 树形网格 Treegrid 简单实例
- vs2012 build boost
- JUI编辑器的使用
- Arduino入门教程--连载
- UIView的动画
- UITableViewCell选中无色
- iOS开发中UISlider的简单使用
- United UI
- Fuel 管理节点