您的位置:首页 > 其它

GYM 101149 H.Streets of Working Lanterns(贪心)

2017-03-19 10:18 330 查看
Description

给出一个括号序列,其中有一些问号可以填左括号或右括号,问是否存在一种填充方案使得该序列变成合法括号序列

Input

输入一个括号序列,串长不超过5e5

Output

如果存在合法填充则输出填充后的合法括号序列,否则输出Impossible

Sample Input

(?(?))

Sample Output

((()))

Solution

贪心,前面的括号填左括号,后面的括号填右括号,具体数量需要使得整体左括号等于右括号,填完之后判合法即可

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 555555
char s[maxn];
int main()
{
while(~scanf("%s",s))
{
int n=strlen(s),num=0,res=0,cnt,gg=0;
for(int i=0;i<n;i++)
if(s[i]=='(')res++;
else if(s[i]==')')res--;
else num++;
if(abs(res)>num||(num-abs(res))%2!=0)gg=1;
else
{
cnt=(num-res)/2;
res=0;
for(int i=0;i<n;i++)
{
if(s[i]=='?')
{
if(cnt)s[i]='(',cnt--;
else s[i]=')';
}
if(s[i]=='(')res++;
else
{
res--;
if(res<0)
{
gg=1;
break;
}
}
}
}
if(gg)printf("Impossible\n");
else printf("%s\n",s);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: