Codeforces Round #282 (Div. 1) A. Treasure

A. Treasure
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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.

Input

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.

Output

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.

Sample test(s)
input
(((#)((#)
output
1
2
input
()((#((#(#()
output
2
2
1
input
#
output
-1
input
(#)
output
-1
Note

|s| denotes the length of the string s.

思路:先把 ) 给匹配了,然后匹配 # ,如果不是最后一个# ,那么就只给它匹配一个。。

#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 ;
}
View Code

 

posted @ 2014-12-14 12:49  _log__  阅读(188)  评论(0编辑  收藏  举报