版权声明:欢迎转载 https://blog.csdn.net/yandaoqiusheng/article/details/88604189
题目链接:传送门
求一个括号序列的最长合法序列和它的数量
设
表示以
结尾的最长的合法序列
当当前字符为左括号
时,将它入栈
否则为右括号,并且栈不为空,
就是上一个入栈的左括号到当前位置的长度
当然
这种情况的答案是
如果只是上面那种操作的话答案只是
所以还要加上上一个匹配成功的
就是上一个左括号的左边
也就是匹配成功的右括号的的
/**
* @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;
}