题意:
给n个只有括号字符串通过排序让他是的正规括号如()或(())最多的子字符串长度。
题解:
对字符串进行排序,排序规则如下:
)))))((--左少右多--a 类型
))(((((--左多右少--b 类型
如果 a 与 a 比较:
按照右括号从多到少排序;
如果 b 与 b 比较:
按照左括号从少到多排序;
如果 a 与 b 比较:
按照先 b 后 a 的顺序排序。
最后进行匹配括号。
#include <bits/stdc++.h>
using namespace std;
struct node{
int l, r, much;
}example[100005];
char edge[100005];
bool cmp(node a, node b){
if(a.l <= a.r && b.l > b.r){
return false;
}
else if(a.l > a.r && b.l <= b.r){
return true;
}
else if(a.l <= a.r && b.l <= b.r){
return a.l > b.l;
}
else{
return a.r < b.r;
}
}
int main(){
int t;
scanf("%d", &t);
while(t--){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%s", edge);
int a = 0, b = 0, c = 0;
for(int j = 0; edge[j] != '\0'; j++){
if(edge[j] == '('){
a++;
}
else{
if(a){
a--;
c++;
}
else{
b++;
}
}
}
example[i].l = a;
example[i].r = b;
example[i].much = c;
}
sort(example, example+n, cmp);
long long ans = 0, num_l = 0;
for(int i = 0; i < n; i++){
ans += example[i].much;
if(num_l > example[i].r){
ans += example[i].r;
num_l -= example[i].r;
num_l += example[i].l;
}
else{
ans += num_l;
num_l = example[i].l;
}
}
printf("%lld\n", ans*2);
}
}