CF5C Longest Regular Bracket Sequence

版权声明:欢迎转载 https://blog.csdn.net/yandaoqiusheng/article/details/88604189

题目链接:传送门
求一个括号序列的最长合法序列和它的数量

f [ i ] f[i] 表示以 i i 结尾的最长的合法序列
当当前字符为左括号 ( ( 时,将它入栈
否则为右括号,并且栈不为空, f [ i ] f[i] 就是上一个入栈的左括号到当前位置的长度
当然 ( ) ( ) ()() 这种情况的答案是 4 4
如果只是上面那种操作的话答案只是 2 2
所以还要加上上一个匹配成功的 f f
就是上一个左括号的左边
也就是匹配成功的右括号的的 f f

/**
 * @Date:   2019-03-16T19:29:48+08:00
 * @Last modified time: 2019-03-16T19:29:49+08:00
 */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define A 1000010
#define B 2010

using namespace std;
typedef long long ll;
int f[A], cnt[A], ans, sta[A], top;
char s[A];

int main(int argc, char const *argv[]) {
    cin >> (s + 1); int n = strlen(s + 1); cnt[0] = 1;
    for (int i = 1; i <= n; i++) {
        if (s[i] == '(') sta[++top] = i;
        else if (top) {
            f[i] = i - sta[top] + 1 + f[sta[top] - 1];
            top--;
            cnt[f[i]]++;
        }
    }
    for (int i = n; i >= 0; i--)
        if (cnt[i]) {
            cout << i << " " << cnt[i] << endl;
            break;
        }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yandaoqiusheng/article/details/88604189