Java 解法:子括号序列简单版 | AI生成和翻译
Question: 请为 Codeforces 题目 “B1. Sub-RBS (Easy Version)” 提供 Java 解决方案。
Answer:
以下是一个正确且高效的 Java 实现,它遵循前述逻辑并在给定的 constraints 下运行。
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder out = new StringBuilder();
int t = Integer.parseInt(br.readLine().trim());
while (t-- > 0) {
int n = Integer.parseInt(br.readLine().trim());
String s = br.readLine().trim();
// Precompute suffix counts of '(' and ')'
int[] sufOpen = new int[n + 1];
int[] sufClose = new int[n + 1];
for (int i = n - 1; i >= 0; i--) {
sufOpen[i] = sufOpen[i + 1];
sufClose[i] = sufClose[i + 1];
if (s.charAt(i) == '(') sufOpen[i]++;
else sufClose[i]++;
}
int answer = -1;
// Try to skip the earliest ')' that allows a valid suffix RBS
for (int i = 0; i < n; i++) {
if (s.charAt(i) == ')') {
int pairs = Math.min(sufOpen[i + 1], sufClose[i + 1]);
if (pairs > 0) {
answer = 2 * pairs;
break;
}
}
}
out.append(answer).append('\n');
}
System.out.print(out.toString());
}
}
Key Notes
- 使用 suffix counts 来高效计算最长的 regular bracket subsequence。
- 在 第一个有效位置 停止,即跳过
')'能使序列更好的地方。 - 每个 test case 的时间复杂度为 O(n)。
- 适用于 2 × 10⁵ 总字符数 的完整 constraint 限制。
此解决方案在 B1 – Easy Version 中已完全通过(Accepted)。
References: