zoukankan      html  css  js  c++  java
  • [CF5C] Longest Regular Bracket Sequence

    [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;
    }
    
  • 相关阅读:
    Nginx
    Web 系统架构一般组成
    分布式系统常见的问题
    Scala + Thrift+ Zookeeper+Flume+Kafka配置笔记
    Spring Boot—21Actuator--监控
    Zookeeper
    Spring Boot—20Zookeeper
    Spring Boot—19Session
    Spring Boot—19Cache
    Spring Boot—18Redis
  • 原文地址:https://www.cnblogs.com/mollnn/p/14151845.html
Copyright © 2011-2022 走看看