Codeforces 612C Replace To Make Regular Bracket Sequence 【stack】
2016-07-25 21:38
387 查看
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。
记录左右括号的数量,若不相等,则说明没有#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
int main()
{
stack<char> s;
char c[1000010];
int i,l;
while(scanf("%s",c)!=EOF)
{
int ans=0,lift=0;;
l=strlen(c);
for(i=0;i<l;i++)
{
if(c[i]=='{'||c[i]=='<'||c[i]=='['||c[i]=='(')
{
s.push(c[i]);
lift++;
}
else
{
if(c[i]=='}')
{
if(s.empty())
break;
else if(s.top()=='{')
s.pop();
else
{
ans++; s.pop();
}
}
else if(c[i]==']')
{
if(s.empty())
break;
else if(s.top()=='[')
s.pop();
else
{
ans++; s.pop();
}
}
if(c[i]=='>')
{
if(s.empty())
break;
else if(s.top()=='<')
s.pop();
else
{
ans++; s.pop();
}
}
if(c[i]==')')
{
if(s.empty())
break;
else if(s.top()=='(')
s.pop();
else
{
ans++;
s.pop();
}
}
}
}
if(double(l)/2!=double(lift))
printf("Impossible\n");
else if(i==l)
printf("%d\n",ans);
else printf("Impossible\n");
}
return 0;
}
完成配对。
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。
记录左右括号的数量,若不相等,则说明没有#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
int main()
{
stack<char> s;
char c[1000010];
int i,l;
while(scanf("%s",c)!=EOF)
{
int ans=0,lift=0;;
l=strlen(c);
for(i=0;i<l;i++)
{
if(c[i]=='{'||c[i]=='<'||c[i]=='['||c[i]=='(')
{
s.push(c[i]);
lift++;
}
else
{
if(c[i]=='}')
{
if(s.empty())
break;
else if(s.top()=='{')
s.pop();
else
{
ans++; s.pop();
}
}
else if(c[i]==']')
{
if(s.empty())
break;
else if(s.top()=='[')
s.pop();
else
{
ans++; s.pop();
}
}
if(c[i]=='>')
{
if(s.empty())
break;
else if(s.top()=='<')
s.pop();
else
{
ans++; s.pop();
}
}
if(c[i]==')')
{
if(s.empty())
break;
else if(s.top()=='(')
s.pop();
else
{
ans++;
s.pop();
}
}
}
}
if(double(l)/2!=double(lift))
printf("Impossible\n");
else if(i==l)
printf("%d\n",ans);
else printf("Impossible\n");
}
return 0;
}
完成配对。
相关文章推荐
- CodeForces 288A Polo the Penguin and Strings (水题)
- Codeforces-612C-Replace To Make Regular Bracket Sequence 【stack】
- POJ 1019:Number Sequence
- Codeforces 612C Replace To Make Regular Bracket Sequence 【stack】
- Android UI学习篇:ListView
- CodeForces 289B Polo the Penguin and Matrix (数学,中位数)
- 【Codeforces】-612C-Replace To Make Regular Bracket Sequence(括号配对,栈)
- C. Replace To Make Regular Bracket Sequence
- CodeForces 289A Polo the Penguin and Segments (水题)
- 导航栏的相关设置
- HDU 1711 Number Sequence(kmp专题)
- 清除confluent 在zookeeper中的数据
- hdu 1159 Common Subsequence
- CodeForces 288A Polo the Penguin and Strings
- Android UIAutomator浅谈
- 一个程序员眼中的好UI
- CodeForces 289B Polo the Penguin and Matrix
- CodeForces 289A Polo the Penguin and Segments
- UITableView之一分组简单使用
- 第一个Java SWing GUI程序