题目链接
题目大意:组合n个括号序列,然后求组合后可得到的最长合法子括号序列的长度。
#include <bits/stdc++.h>
using namespace std;
const int MAX = 112345;
struct Node {
int x, y;
} data[MAX];
bool operator<(const Node &l, const Node &r) {
if(min(l.x, r.y) > min(l.y, r.x))return 1; //考虑AB还是BA
if(min(l.x, r.y) < min(l.y, r.x))return 0;
return l.y<r.y; //使右括号少的在前面
}
char str[MAX];
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
int ans = 0;
for (int i = 1; i <= n; i++) {
scanf(" %s", str);
stack<char> ss;
int len = strlen(str);
for (int j = 0; j < len; j++) {
if (!ss.empty()) {
if (ss.top() == '(' && str[j] == ')') {
ss.pop();
ans++;
} else {
ss.push(str[j]);
}
} else ss.push(str[j]);
}
int x, y;
x = y = 0;
while (!ss.empty()) {
if (ss.top() == '(') x++;
else y++;
ss.pop();
}
data[i].x = x;
data[i].y = y;
}
sort(data + 1, data + 1 + n);
int sum = data[1].x;
for (int i = 2; i <= n; i++) {
ans += min(sum, data[i].y);
sum -= data[i].y;
sum = max(0, sum);
sum += data[i].x;
}
printf("%d\n", ans * 2);
}
}