1. 程式人生 > 實用技巧 >[CF5C] Longest Regular Bracket Sequence - 貪心,dp

[CF5C] Longest Regular Bracket Sequence - 貪心,dp

[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;
}