Gym - 101149H Streets of Working Lanterns (括号匹配)

H. Streets of Working Lanterns
time limit per test
2.0 s
memory limit per test
256 MB
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
 
     
 
     
题意:
问你能否匹配上。。
不知道当时咋想的越想越复杂。。
括号匹配。。第一个条件 左括号数等于右括号。
第二个条件每个点的左括号数不能大于右括号。
 
     
定义两个变量存储 ?数量tmp 和 左括号与右括号的差值 cnt
if(cnt>tmp||len%2)如果差值大于问号数怎么都弥补不了。。长度为奇数肯定不满足。
 
     
然后就是确定每个位置右括号数量都大于左括号数量。
 
     
#include
#include
#include
using namespace std;
#define N 500005
char s[N];
int main()
{
    while(~scanf("%s",s))
    {
        int res=0;
        int cnt=0;
        int len=strlen(s);
        for(int i=0; icnt||(res+cnt)%2)Flag=1;
        else
        {
            int tmp=(cnt-res)/2;
            res=0;
            for(int i=0; i


你可能感兴趣的:(动态规划)