Codeforces 612C: Replace To Make Regular Bracket Sequence(栈)
2016-07-26 00:00
597 查看
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.
Examples
input
output
input
output
input
output
题目大意:括号匹配的变形题,在这里只要是左括号,就能跟右括号消掉,但是消掉前得把左括号变成和右括号一样的才能消掉,问给你一个字符串,匹配的时候需要将左括号变几次,如果不能消掉,则输出Impossible。
解题思路:跟括号匹配差不多,就是多了几个条件。
代码如下:
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.
Examples
input
[<}){}
output
2
input
{()}[]
output
0
input
]]
output
Impossible
题目大意:括号匹配的变形题,在这里只要是左括号,就能跟右括号消掉,但是消掉前得把左括号变成和右括号一样的才能消掉,问给你一个字符串,匹配的时候需要将左括号变几次,如果不能消掉,则输出Impossible。
解题思路:跟括号匹配差不多,就是多了几个条件。
代码如下:
#include <cstdio> #include <cstring> #include <queue> #include <stack> using namespace std; char a[1000010]; int main() { scanf("%s",a); int size=strlen(a); stack<char>q; int cnt=0; for(int i=0;i<size;i++) { if(q.empty()) { q.push(a[i]); } else { if((q.top()=='<'&&(a[i]=='>'||a[i]==')'||a[i]=='}'||a[i]==']'))||(q.top()=='('&&(a[i]=='>'||a[i]==')'||a[i]=='}'||a[i]==']'))||(q.top()=='{'&&(a[i]=='>'||a[i]==')'||a[i]=='}'||a[i]==']'))||(q.top()=='['&&(a[i]=='>'||a[i]==')'||a[i]=='}'||a[i]==']')))//左括号碰到了右括号 { if((q.top()=='<'&&a[i]=='>')||(q.top()=='('&&a[i]==')')||(q.top()=='{'&&a[i]=='}')||(q.top()=='['&&a[i]==']'))//如果左右括号是同类的,那么直接消掉 { q.pop(); } else { cnt++;//不同类的,消掉前,变数+1 q.pop(); } } else//左右括号不同类,加入栈 { q.push(a[i]); } } } if(q.empty())//如果最后匹配消掉成功,则栈一定是空的 printf("%d\n",cnt); else printf("Impossible\n"); return 0; }
相关文章推荐
- C++基于栈实现铁轨问题
- 浅析C语言中堆和栈的区别
- C语言栈的表示与实现实例详解
- C语言实现颠倒栈的方法
- 算法系列15天速成 第十天 栈
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- Array栈方法和队列方法的特点说明
- java数据结构之java实现栈
- 浅析栈区和堆区内存分配的区别
- 用Java代码实现栈数据结构的基本方法归纳
- 用PHP解决的一个栈的面试题
- 浅谈C#中堆和栈的区别(附上图解)
- C#使用Object类实现栈的方法详解
- JavaScript数据结构与算法之栈详解
- C语言之栈和堆(Stack && Heap)的优缺点及其使用区别
- Python实现栈的方法
- JavaScript数组的栈方法与队列方法详解
- JavaScript数据结构与算法之栈与队列
- JavaScipt中栈的实现方法
- Java中堆和栈的区别详解