CF 495C. Treasure 模拟(括号配对)

来源:互联网 发布:网络最好的诈骗文章 编辑:程序博客网 时间:2024/05/17 01:57
题意:给出字符串s,字符串包含'(',')','#' 先在将'#'替换成1个或者一个以上的右括号.
|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;elsepos[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;elseflag=false;break;}}if(flag==false){puts("-1");return 0;}for(int i=1;i<=id;i++)printf("%d\n",res[i]+1);return 0;}


原创粉丝点击