Codeforces 612C: Replace To Make Regular Bracket Sequence(栈)
2016-07-28 09:43
375 查看
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
Input
[<}){}
Output
2
Input
{()}[]
Output
0
Input
]]
Output
Impossible
题意:括号配对问题,这里你可以将相同方向的括号换成别的括号,最后如果能配对输出换了多少个,如果不能输出Impossible;
思路:栈,遇到左边的括号进栈并保存有多少个,遇到右边的判断与最后一个进栈的是否配对如果配对则ans-1。这里需要注意的是有可能左边多了或者右边多了这时可以判断栈是否为空 如果为空 则在输入右边的就Impossible 如果不为空 最后判断时 可以知道 有左边的没有配对成功 输出Impossible
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<string.h>
using namespace std;
char a[1000011];
int main()
{
while(~scanf("%s",a))
{
int t=strlen(a);
if(t%2!=0)
printf("Impossible\n");
else
{
stack<char >sta;
int ans=0,p=0;
for(int i=0;i<t;i++)
{
if(a[i]=='{'||a[i]=='['||a[i]=='('||a[i]=='<')
{
sta.push(a[i]);
ans++;
}
else
{
if(sta.empty())
{
p++;
printf("Impossible\n");
break;
}
else
{
char s=sta.top();
if((s=='{'&&a[i]=='}')||(s=='('&&a[i]==')')||(s=='['&&a[i]==']')||(s=='<'&&a[i]=='>'))
{
ans--;
}
sta.pop();
}
}
}
if(p==0)
{
if(sta.empty())
{
if(ans<0)
printf("Impossible\n");
else
printf("%d\n",ans);
}
else
printf("Impossible\n");
}
}
memset(a,0,sizeof(a));
}
return 0;
}
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
Input
[<}){}
Output
2
Input
{()}[]
Output
0
Input
]]
Output
Impossible
题意:括号配对问题,这里你可以将相同方向的括号换成别的括号,最后如果能配对输出换了多少个,如果不能输出Impossible;
思路:栈,遇到左边的括号进栈并保存有多少个,遇到右边的判断与最后一个进栈的是否配对如果配对则ans-1。这里需要注意的是有可能左边多了或者右边多了这时可以判断栈是否为空 如果为空 则在输入右边的就Impossible 如果不为空 最后判断时 可以知道 有左边的没有配对成功 输出Impossible
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<string.h>
using namespace std;
char a[1000011];
int main()
{
while(~scanf("%s",a))
{
int t=strlen(a);
if(t%2!=0)
printf("Impossible\n");
else
{
stack<char >sta;
int ans=0,p=0;
for(int i=0;i<t;i++)
{
if(a[i]=='{'||a[i]=='['||a[i]=='('||a[i]=='<')
{
sta.push(a[i]);
ans++;
}
else
{
if(sta.empty())
{
p++;
printf("Impossible\n");
break;
}
else
{
char s=sta.top();
if((s=='{'&&a[i]=='}')||(s=='('&&a[i]==')')||(s=='['&&a[i]==']')||(s=='<'&&a[i]=='>'))
{
ans--;
}
sta.pop();
}
}
}
if(p==0)
{
if(sta.empty())
{
if(ans<0)
printf("Impossible\n");
else
printf("%d\n",ans);
}
else
printf("Impossible\n");
}
}
memset(a,0,sizeof(a));
}
return 0;
}
相关文章推荐
- HDU-1806 Frequent values (RMQ, 最大连续值区间)
- POJ 2371 Questions and answers
- HDOJ 4027 Can you answer these queries?(线段树+区间标记)
- Stacked Attention Networks for Image Question Answering
- request.getParameterNames()步骤
- Longest Ordered Subsequence
- Burp Suite
- Longest Increasing Subsequence
- iOS开发从入门到精通--UIGesture手势扩展,平移,滑动,长按
- Java中ProcessBuilder使用
- what does “static int function(…) __acquires(..) __releases(…){” mean?
- [转]Quick Tip: Error: 18456, Severity: 14, State: 38.
- POJ-2533-Longest Ordered Subsequence
- Java中String、StringBuffer和StringBuilder
- 86.View the Exhibit to examine the output for the CROSSCHECK BACKUP command. Which statement is true
- vue.js表单数据双向绑定
- ProgressBar(进度条)
- HDU 3415 Max Sum of Max-K-sub-sequence(长度不超过k的最大连续子序列和,单调队列)
- android开发仿ios的UIScrollView
- Android_UI:ViewPager