首页 > 其他 > 详细

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

时间:2020-12-17 21:02:04      阅读:36      评论:0      收藏:0      [点我收藏+]

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

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

原文:https://www.cnblogs.com/mollnn/p/14151845.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!