题意:给出字符串s,字符串包含'(',')','#' 先在将'#'替换成1个或者一个以上的右括号.
|s|<=1e5,问是否存在替换方案,使得字符串的括号是合法的,若存在,则输出每个'#'的替换个数,若无解输出-1.
任意前缀i中右括号数量<=左括号,最后的左括号和右括号相等即为合法.
'#'至少为一个右括号 先放用一个右括号来替,核心:然后将已经配对的左右括号删除.若此时前缀多')'则无解.
|s|<=1e5,问是否存在替换方案,使得字符串的括号是合法的,若存在,则输出每个'#'的替换个数,若无解输出-1.
任意前缀i中右括号数量<=左括号,最后的左括号和右括号相等即为合法.
'#'至少为一个右括号 先放用一个右括号来替,核心:然后将已经配对的左右括号删除.若此时前缀多')'则无解.
剩下的只能为:((((## 或者 C#C#CC#. 也就是只要最后一个为'#'即有解
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
char s[N];
int vis[N],pos[N],id=0,res[N];
stack<int> sta;
vector<char> a;
int main()
{
scanf("%s",s+1);
int n=strlen(s+1);
bool flag=true;
for(int i=1;i<=n;i++)
{
if(s[i]=='(')
sta.push(i);
else
{
if(sta.empty())
flag=false;
else
{
int z=sta.top();
vis[z]=1,sta.pop();
if(s[i]!='#')
vis[i]=1;
else
pos[i]=++id;
}
}
}
int re=sta.size();
if(re)
for(int i=n;i>=1;i--)
{
if(!vis[i])
{
if(s[i]=='#')
res[pos[i]]=re;
else
flag=false;
break;
}
}
if(flag==false)
{
puts("-1");
return 0;
}
for(int i=1;i<=id;i++)
printf("%d\n",res[i]+1);
return 0;
}