This is yet another problem dealing with regular bracket sequences.
We should remind you that a bracket sequence is called regular, if byinserting «+» and «1» into it we can get a correct mathematical expression. For example,sequences «(())()», «()» and «(()(()))» are regular, while «)(», «(()» and «(()))(» are not.
You are given a string of «(» and «)»characters. You are to find its longest substring that is a regular bracketsequence. You are to find the number of such substrings as well.
Input
The first line of the input file contains a non-empty string, consistingof «(» and «)» characters. Its length does not exceed 106.
Output
Print the length of the longest substring that is a regular bracketsequence, and the number of such substrings. If there are no such substrings,write the only line containing "0 1".
Sample test(s)
input
)((())))(()())
output
6 2
input
))(
output
0 1
思路:
开一个flag数组,对应字符串每一位是否正确,全部先标记为false
然后用栈判断、匹配括号,正确的括号直接对应位置变为true
最后就是算出true的最长序列
程序:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
using namespace std;
#define L(u) (u<<1)
#define R(u) (u<<1|1)
#define lowbit(x) (x&-x)
#define rep(i,x,y) for (i=x;i<=y;i++)
#define ll __int64
#define max(x,y) ((x>y)?(x),(y))
#define min(x,y) ((x<y)?(x),(y))
#define sd(x) scanf("%d",&x)
#define sd2(x,y) scanf("%d%d",&x,&y)
#define slld(x) scanf("%lld",&x)
const int N = 1000005;
struct node
{
char c;
int id;
}a[N];
char st[N];
bool flag[N];
int main()
{
int i, j;
scanf("%s", st);
memset(flag, false, sizeof(flag));
int len = strlen(st) - 1;
rep(j, 0, len)
{
if (st[j] == '(')
break;
}
rep(i, 0, len)
{
a[i].c = st[i];
a[i].id = i;
}
stack<node> q;
node temp;
rep(i, j, len)
{
if (a[i].c == '(')
{
q.push(a[i]);
}
else
if (a[i].c == ')')
{
if (q.empty())
{
q.push(a[i]);
}
else
{
temp = q.top();
if (temp.c == '(')
{
flag[i] = true;
flag[temp.id] = true;
q.pop();
}
else
{
q.push(a[i]);
}
}
}
}
int count = 0;
int mc = 0, mn = 1;
rep(i, 0, len)
{
if (flag[i] == false)
{
count = 0;
}
else
{
count++;
if (count>mc)
{
mc = count;
mn = 1;
}
else
if (count == mc)
{
mn++;
}
}
}
printf("%d %d\n", mc, mn);
return 0;
}