1791 合法括号子段

原创 2017年10月07日 18:23:58

1791 合法括号子段

Description

有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列。

合法括号序列的定义是:

1.空序列是合法括号序列。
2.如果S是合法括号序列,那么(S)是合法括号序列。
3.如果A和B都是合法括号序列,那么AB是合法括号序列。

Input

多组测试数据。

第一行有一个整数T(1<=T<=1100000),表示测试数据的数量。

接下来T行,每一行都有一个括号序列,是一个由’(‘和’)’组成的非空串。

所有输入的括号序列的总长度不超过1100000。

Output

输出T行,每一行对应一个测试数据的答案。

Input示例

5
(
()
()()
(()
(())

Output示例

0
1
3
1
2

Solution

一道神奇的dp题,其实状态也很好想,因为对于其中每个‘(’最多只能找到一个与之相匹配的‘)’。显然,在括号串固定的情况下,括号的匹配是固定不变的。有了这个策略,我们就可以先用栈将括号匹配掉,p[i]表示与i这个括号相匹配的括号的位置,易得到dp方程 ans[i]=ans[p[i]+1]+1,再线扫一遍求和即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int T,p[1100010],stuck[1100010],ans[1100010];
char ch[1100010];
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%s",ch+1);
        int l=strlen(ch+1),top=0;
        long long num=0;
        for (int i=1;i<=l;i++) p[i]=-1;
        for (int i=1;i<=l;i++){
            if (ch[i]=='(') stuck[++top]=i;
            else if (top) p[stuck[top--]]=i;
        }
        for (int i=l;i>=1;i--)
            if (p[i]==-1) ans[i]=0; else ans[i]=ans[p[i]+1]+1;
        for (int i=1;i<=l;i++)
            num+=ans[i];
        printf("%lld\n",num);
    }
    return 0;
}

51Nod-1791-合法括号子段

ACM模版描述题解这里,我们需要明确区分一个定义,什么叫做子段?什么叫做子序列?子段是子序列的一种,也叫做连续子序列,而子序列呢?如果不要求连续,则是可以从原序列中任意取,但是要保持原先的先后顺序即可...
  • f_zyj
  • f_zyj
  • 2017年07月31日 11:40
  • 401

51nod 合法括号子段

Description有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列。 合法括号序列的定义是: 1.空序列是合法括号序列。 2.如果S是合法括号序列,那么(S)是合法括号序列。 ...
  • xinxiaxindong
  • xinxiaxindong
  • 2017年07月31日 08:52
  • 525

51 nod 合法括号子段 (单调栈)

合法括号子段    System Message (命题人) 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 有一个括号序列,现在要计算一下它有多少非空子段是合法...
  • yjf3151731373
  • yjf3151731373
  • 2017年08月14日 10:24
  • 107

[分治] 51nod算法马拉松27 A.合法括号子段

题意有一个长度为 nn 的括号序列,现在要计算一下它有多少非空子段是合法括号序列。 合法括号序列的定义是: 1.空序列是合法括号序列。 2.如果 SS 是合法括号序列,那么 (S)(S) 是合法...
  • CHHNZ
  • CHHNZ
  • 2017年07月30日 21:59
  • 419

网易2018校园招聘:最长公共子括号序列 [python]

''' [编程题] 最长公共子括号序列 时间限制:1秒 空间限制:100768K 一个合法的括号匹配序列被定义为: 1. 空串""是合法的括号序列 2. 如果"X"和"Y"是合法的序列,那么"XY"也...
  • qq_34617032
  • qq_34617032
  • 2017年11月19日 11:51
  • 54

正确匹配的最长的括号子串

题目:有个由’(’和’)’组成的字符串,求出其中最长的正确匹配子串,如((()()中是()() 分析:使用字符串进出栈来模拟括号的匹配,栈中保存没有进行匹配的字符串,扫描字符串,对于第i个字符,如果...
  • Cindy_zhong
  • Cindy_zhong
  • 2013年08月28日 14:25
  • 1244

【九度】题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配;所有的右括号都有唯一的...
  • u013027996
  • u013027996
  • 2013年12月11日 13:24
  • 2677

Hrbust 2230 括号子序列-A【dp】感谢Zqc!

括号子序列-A Time Limit: 500 MS Memory Limit: 32768 K Total Submit: 40(12 user...
  • mengxiang000000
  • mengxiang000000
  • 2017年01月15日 19:52
  • 372

多频段融合方法——图像拼接

原文地址:http://blog.csdn.net/smallflyingpig/article/details/61200497 图像拼接一般包括warp(映射), compens...
  • ccblogger
  • ccblogger
  • 2017年04月24日 21:39
  • 1286

判断IPV4地址是否合法

/***************判断是否是合法的IPV4*****************************************/ bool isValidIP(string ip){ i...
  • gukesdo
  • gukesdo
  • 2013年05月16日 14:02
  • 4206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1791 合法括号子段
举报原因:
原因补充:

(最多只允许输入30个字)