您的位置:首页 > 产品设计 > UI/UE

CodeForces 5C - Longest Regular Bracket Sequence

2015-07-29 00:07 507 查看
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
;

char st
;
bool flag
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: