Codeforces Round #282 (Div. 1) A. Treasure
Malek has recently found a treasure map. While he was looking for a treasure he found a locked door. There was a string s written on the door consisting of characters '(', ')' and '#'. Below there was a manual on how to open the door. After spending a long time Malek managed to decode the manual and found out that the goal is to replace each '#' with one or more ')' characters so that the final string becomes beautiful.
Below there was also written that a string is called beautiful if for each i (1 ≤ i ≤ |s|) there are no more ')' characters than '(' characters among the first i characters of s and also the total number of '(' characters is equal to the total number of ')' characters.
Help Malek open the door by telling him for each '#' character how many ')' characters he must replace it with.
The first line of the input contains a string s (1 ≤ |s| ≤ 105). Each character of this string is one of the characters '(', ')' or '#'. It is guaranteed that s contains at least one '#' character.
If there is no way of replacing '#' characters which leads to a beautiful string print - 1. Otherwise for each character '#' print a separate line containing a positive integer, the number of ')' characters this character must be replaced with.
If there are several possible answers, you may output any of them.
(((#)((#)
1
2
()((#((#(#()
2
2
1
#
-1
(#)
-1
|s| denotes the length of the string s.
思路:先把 ) 给匹配了,然后匹配 # ,如果不是最后一个# ,那么就只给它匹配一个。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<set> #include<map> #include<stack> #include<cmath> #define LL long long #define maxn 100010 #define eps 1e-9 using namespace std; bool vi[maxn] ; char a[maxn] ; int ans[maxn] ; stack<int>ss; int main() { int i,n,m,j,k,id; int T,case1=0,len ; while(scanf("%s",a+1) != EOF) { n = strlen(a+1); while(!ss.empty())ss.pop(); memset(vi,0,sizeof(vi)) ; bool flag=false; for( i = 1 ; i <= n ;i++) { if(a[i]=='(') { ss.push(i) ; } else if(a[i]==')') { if(ss.empty()) { flag=true; break ; } k=ss.top(); ss.pop(); vi[k]=1; } else if(a[i]=='#') id=i; } if(flag) { puts("-1") ; continue ; } int cnt=0; len=0; for( i = 1 ; i <= n ;i++)if(!vi[i]&&a[i] != ')') { if(a[i]=='(')cnt++; else if(a[i]=='#') { if(cnt==0) { flag=true; break ; } else { if(i==id)ans[len++]=cnt,cnt=0; else ans[len++]=1; if(cnt)cnt--; } } } if(flag||cnt>0)puts("-1") ; else { if(len)cout<<ans[0]<<endl; for( i = 1 ; i < len ;i++) cout << ans[i] << endl; } } return 0 ; }