您的位置:首页 > 其它

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

2017-02-24 15:20 225 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: