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;
}