H. Streets of Working Lanterns----思维题

来源:互联网 发布:python scrapy 教程 编辑:程序博客网 时间:2024/05/17 00:18

H. Streets of Working Lanterns
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Policeman Anatoliy monitors a lair of unorganized criminal group spreading prohibited Asian drawings. The lair has only one entrance, which is also an exit. When someone enters into the lair, Anatoliy writes an opening round bracket in his notepad, and when someone comes out, he writes a closing round bracket.

Long surveillance provokes an appetite, so Anatoliy has to eat donuts not to starve to death. Unfortunately, after the surveillance had ended, Anatoliy discovered a lot of greasy stains left by donuts in his notepad, and they prevent to understand which brackets are opening or closing. He doesn't want his boss to shout on him, so he must restore his records. He ensured that the lair of criminals was empty before he started the surveillance and after he ended it.

Input

The input contains a single string of length no more than 5·105. This string consists of characters «(», «)» and «?». Character «(» means that someone entered into the lair, character «)» means that someone came out of it, and character «?» means that there is a greasy stain on this place, and it's impossible to determine which of the other two characters was there initially.

Output

Output a recovered string consisting of characters «(» and «)» only, so that Anatoliy really could write it in his notepad. If there are many suitable strings, output any of them. If Anatoliy messed up something and his records contained mistakes, output «Impossible», without quotes.

Examples
input
(?(?))
output
()(())
input
()
output
()
input
?(
output
Impossible

题目链接:http://codeforces.com/gym/101149/problem/H



这个题比赛的时候我没有做出来,想麻烦了,赛后按照柏皓的思路水了一发,过了,这个题就是让你把?变成“(”或“)”,看能不能完成括号匹配。

我们先计算一下字符串序列长度,奇数直接输出Impossible,然后我们计算需要多少个左括号,多少个右括号,?的规则是少多少个左括号就把前多少个?变成(,其他的就是),然后看看是否合法就可以。


代码:

#include <cstdio>#include <cstring>#include <iostream>using namespace std;int main(){    string s;    while(cin>>s){        int len=s.length();        if(len&1){            cout<<"Impossible"<<endl;            continue;        }        else{            int a=0,b=0;            for(int i=0;i<len;i++){                if(s[i]=='(')                    a++;            }            int k=len/2-a;            int c=0,d=0;            bool flag=true;            for(int i=0;i<len;i++){                if(s[i]=='?'&&k){                    s[i]='(';                    k--;                }                else if(s[i]=='?'){                    s[i]=')';                }                if(s[i]=='(')                    c++;                if(s[i]==')')                    d++;                if(c<d){                    flag=false;                    break;                }            }            if(!flag||(c!=d)){                cout<<"Impossible"<<endl;            }            else{                cout<<s<<endl;            }        }    }    return 0;}


0 0
原创粉丝点击