括号匹配 CodeForces 5C

Description

This is yet another problem dealing with regular bracket sequences.

We should remind you that a bracket sequence is called regular, if by inserting «+» 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 bracket sequence. You are to find the number of such substrings as well.

Input

The first line of the input file contains a non-empty string, consisting of «(» and «)» characters. Its length does not exceed 106.

Output

Print the length of the longest substring that is a regular bracket sequence, and the number of such substrings. If there are no such substrings, write the only line containing "0 1".

Sample Input

Input

)((())))(()())

Output

6 2

Input

))(

Output

0 1
#include <cstdio>
#include <queue>
#include <stack>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int oo = 1e9;
const double PI = acos(-1);
const int N = 1e6+7;
char str[N];
int len[N];/**< 如果这个位置是‘)‘ 保存从字符串头部开始到这个位置的最大匹配数量 */
int main()
{
    int i, ans=0, sum=0;
    stack <int >sta;
    scanf("%s", str);
    int M = strlen(str);
    for(i = 0; i < M; i++)
    {
        if(str[i] == ‘(‘) sta.push(i);
        else if(sta.size())
        {
            int top = sta.top();

            sta.pop();

            if(str[top-1] == ‘)‘)
                len[i] = (i-top+1) + len[top-1];

            else
                len[i] = (i-top+1);

            ans = max(ans, len[i]);
        }
    }
    for(i = M-1; i >= 0; i--)
    {
        if(str[i] == ‘)‘ && len[i] && len[i] == ans)
        sum++;
    }
    if(sum == 0) sum = 1;
    printf("%d %d\n", ans, sum);
    return 0;
}

  

时间: 2024-10-13 04:04:21

括号匹配 CodeForces 5C的相关文章

codeforces 380C 线段树括号匹配

Sereja and Brackets Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description Sereja has a bracket sequence s1,?s2,?...,?sn, or, in other words, a string s of length n, consisting of characters "(&quo

CodeForces 5C(DP初步_G题)解题报告

题目链接:http://codeforces.com/problemset/problem/5/C ----------------------------------------------------------------------------- 题意:给一个括号序列,求满足括号匹配的最长子串长度和个数. 思路:用栈记录序列中的左括号位置,每当出现一个右括号,判断栈是否为空,若不为空,用此时右括号的位置i减去最近的左括号位置再+1即可得到串的长度. 注意:()(),在第二个括号之前已经有

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为:  

括号匹配问题(顺序栈实现)

本周老师作业留了两个.先上传一个吧.那个有时间我再传上来~ 本周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素和判空操作 括号匹配问题 3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果. 4.程序调试运行并保存输出结果. 5.整理并提交实验作业. 1 #include <cstdio> 2 #include <cstring>

堆栈_括号匹配

class Solution { public: bool isValid(string s) { if(s.empty()) return false; stack<int> s1; int n=s.size(); for(int i=0;i<n;i++) { if(s[i]=='('||s[i]=='['||s[i]=='{') s1.push(s[i]); else if(s1.empty()) return false; else if((s[i]==')'&&s

括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不

动态规划(2)--括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超

行编辑程序、括号匹配检验

行编辑程序.括号匹配检验程序都是利用的栈的数据结构.而这两个 小程序也非常好的显示了栈先进后出的思想.由于程序本身很简短.清晰,所 以也就不做多的解释了,直接上代码了. 行编辑程序: #include<iostream> #include<stack> using namespace std; int main() { stack<char> sta; char ch = getchar(); while(ch!=EOF) { while(ch!=EOF&&am

题目1153:括号匹配问题(栈的使用)

题目链接:http://ac.jobdu.com/problem.php?pid=1153 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus // // 1153 括号匹配问题.cpp // Jobdu // // Created by PengFei_Zheng on 08/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdio.h>