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