Balanced Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2182 Accepted Submission(s): 537
Problem Description Chiaki has n strings s1,s2,…,sn consisting of '(' and ')'. A string of this type is said to be balanced:
+ if it is the empty string + if A and B are balanced, AB is balanced, + if A is balanced, (A) is balanced.
Chiaki can reorder the strings and then concatenate them get a new string t . Let f(t) be the length of the longest balanced subsequence (not necessary continuous) of t . Chiaki would like to know the maximum value of f(t) for all possible t .
Input There are multiple test cases. The first line of input contains an integer T , indicating the number of test cases. For each test case: The first line contains an integer n (1≤n≤105 ) -- the number of strings. Each of the next n lines contains a string si (1≤|si|≤105 ) consisting of `(' and `)'. It is guaranteed that the sum of all |si| does not exceeds 5×106 . Output For each test case, output an integer denoting the answer. Sample Input
2 1 )()(()( 2 ) )( Sample Output
4 2 难点在于排序,这里我参考了蔡队的博客: http://cubercsl.cn/wiki/2018-HDU-1/ 他都不会证明那我必然不会啊; #include<bits/stdc++.h>
using namespace std;
const int MAX = 1e6;
#define l first
#define r second
pair <int, int> p[MAX];
char a[MAX], s[MAX];
bool cmp(pair <int, int> &a, pair <int, int> &b){
int x = min(a.l, b.r);
int y = min(a.r, b.l);
return x > y || x == y && a.l > b.l;
}
int main(){
int N;
for(scanf("%d", &N); N; N--){
int n;
scanf("%d", &n);
int ans = 0;
for(int i = 1; i <= n; i++){
scanf("%s", s);
int len = strlen(s);
int flag = 0;
for(int j = 0; j < len; j++){
if(s[j] == ')' && flag && a[flag] == '('){
ans++;
flag--;
}
else
a[++flag] = s[j];
}
p[i].l = p[i].r = 0;
for(int j = 1; j <= flag; j++){
if(a[j] == '(')
p[i].l++;
else
p[i].r++;
}
}
sort(p + 1, p + 1 + n, cmp);
int num = 0;
for(int i = 2; i <= n; i++){
num += p[i - 1].l;
if(p[i].r > num){
ans += num;
num = 0;
}
else{
ans += p[i].r;
num -= p[i].r;
}
}
printf("%d\n", ans * 2);
}
return 0;
} |