[CF5C] Longest Regular Bracket Sequence - 貪心,dp
阿新 • • 發佈:2020-12-17
[CF5C] Longest Regular Bracket Sequence - 貪心,dp
Description
給出一個括號序列,求出最長合法子串和它的數量。
Solution
考慮貪心地預處理出每個括號匹配的最近位置,利用棧掃一遍即可。
在處理出第 \(i\) 個字元的匹配位置 \(j\) 後,我們就可以用這一段的值去更新答案,設 \(f[i]\) 表示以 \(i\) 結尾的字尾的最大匹配長度是多少,那麼很容易利用上面的資訊來轉移。
#include <bits/stdc++.h> using namespace std; #define int long long signed main() { string s; cin >> s; int n = s.length(); vector<int> f(n + 2, 0); vector<int> sta(n + 2, 0); int top = 0, ans = 0, cnt = 1; for (int i = 1; i <= n; i++) { if (s[i - 1] == '(') { sta[++top] = i; } else if (top > 0) { f[i] = i - sta[top] + 1 + f[sta[top] - 1]; top--; if (f[i] == ans) { ++cnt; } else if (f[i] > ans) { ans = f[i]; cnt = 1; } } } cout << ans << " " << cnt; }