Let us define a regular brackets sequence in the following way:

  1. Empty sequence is a regular sequence.
  2. If S is a regular sequence, then (S) and [S] are both regular sequences.
  3. If A and B are regular sequences, then AB is a regular sequence.

For example, all of the following sequences of characters are regular brackets sequences:

()[](())([])()[]()[()]

And all of the following character sequences are not:

([))(([)]([(]

Some sequence of characters '(', ')', '[', and ']' is given. You are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. Here, a string a1a2...an is called a subsequence of the string b1b2...bm, if there exist such indices 1 ≤ i1 < i2 < ... < in ≤ m, that aj=bij for all 1 ≤ j ≤ n.

Input

The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. This line is followed by a blank line, and there is also a blank line between two consecutive inputs.

The input file contains at most 100 brackets (characters '(', ')', '[' and ']') that are situated on a single line without any other characters among them.

Output

For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.

Write to the output file a single line that contains some regular brackets sequence that has the minimal possible length and contains the given sequence as a subsequence.

Sample Input

1

([(]

Sample Output

()[()]

紫书上有详解+代码,就不废话了直接贴代码:
 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = ;
char s[maxn];
int d[maxn][maxn];
int n;
inline bool match(char a,char b){
if((a=='('&&b==')')||(a=='['&&b==']')) return true;
else return false;
}
void dp(){
for(int i=;i<n;i++){
d[i+][i]=;
d[i][i]=;
} for(int i=n-;i>=;i--){
for(int j=i+;j<n;j++){
d[i][j]=maxn;
if(match(s[i],s[j]))
d[i][j]=min(d[i][j],d[i+][j-]);
for(int k=i;k<j;k++){
d[i][j]=min(d[i][j],d[i][k]+d[k+][j]);
}
}
}
}
void print(int i,int j){
if(i>j) return;
if(i==j){
if(s[i]=='('||s[i]==')') printf("()");
else printf("[]");
return;
}
int ans=d[i][j];
if(match(s[i],s[j])&&ans==d[i+][j-]){
printf("%c",s[i]);print(i+,j-);printf("%c",s[j]);
return;
}
for(int k=i;k<j;k++){
if(ans==d[i][k]+d[k+][j]){
print(i,k);print(k+,j);
return;
}
} }
int main(int argc, const char * argv[]) {
int T;
scanf("%d",&T);
getchar();
while(T--){
getchar();
memset(s, , sizeof s);
char ch;
for(int i=;(ch=getchar())!='\n';i++){
s[i]=ch;
}
n=strlen(s); dp();
print(,n-);
printf("\n");
if(T!=) printf("\n");
}
return ;
}

最新文章

  1. jQuery-1.9.1源码分析系列(六) 延时对象应用——jQuery.ready
  2. SQL2008 提示评估期已过的解决方法
  3. iOS - OC NSDate 时间
  4. [leetcode]_String to Integer (atoi)
  5. 【CLR VIA C#】读书笔记
  6. java学习面向对象之封装
  7. Spring 入门 Ioc-Xml
  8. 利用反馈字段给帝国cms添加留言板功能(图文教程)
  9. MongoDB聚合
  10. 查找第k小的元素(O(n)递归解法)
  11. PHP+MySQL分页显示示例分析
  12. android JNI的.so库调用
  13. Java大小写转化
  14. 2019.1.17 homework
  15. Python学习笔记-数字类型
  16. 老铁,这年头得玩玩这个:Git基本操作【github】
  17. 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6(8/13)
  18. leetcode笔记:Bulls and Cows
  19. 1z0-052 q209_5
  20. STL标准库-容器-set与multiset

热门文章

  1. 洛谷 P1266 速度限制 最短路+SPFA算法
  2. MySQL安装后设置root 密码
  3. python判断输入日期是该年的第几天
  4. 寻找 K8s 1.14 Release 里的“蚌中之珠”
  5. bzoj1688 疾病管理
  6. 洛谷 P3768 简单的数学题 (莫比乌斯反演)
  7. Effective C++: 03资源管理
  8. phpexcel导出数据库成excel文件
  9. HZOJ trade
  10. Java练习 SDUT-2746_大小写转换