zoukankan      html  css  js  c++  java
  • 51nod1791-合法括号子段

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

    合法括号序列的定义是:

    1.空序列是合法括号序列。

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

    Input
    多组测试数据。
    第一行有一个整数T(1<=T<=1100000),表示测试数据的数量。
    接下来T行,每一行都有一个括号序列,是一个由'('和')'组成的非空串。
    所有输入的括号序列的总长度不超过1100000。
    一开始以为是分治,后俩发现乱搞,num[i]表示从i开始向前的连续括号数。
    然后就用一个栈来维护匹配到的是哪个括号
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<stack>
    using namespace std;
    #define ll long long
    char str[1000505];
    stack<int> s; 
    int T;
    ll ans,num[1000505]; 
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
            scanf("%s",str+1);
            ans=0;
            while(!s.empty()) s.pop(); 
            //memset(num,0,sizeof(num));
            int len=strlen(str+1);
            for(int i=1;i<=len;i++)
            {
                if(str[i]=='(')
                {
                    num[i]=0;
                    s.push(i);
                }else{
                    if(s.empty()) 
                    {
                        num[i]=0;
                        continue;
                    }
                    ans+=(ll)num[s.top()-1]+1;
                    num[i]=(ll)num[s.top()-1]+1;
                    s.pop();
                    //cout<<ans<<endl; 
                }
            }
            printf("%lld
    ",ans);
        }
        
    }

     因为strlen和memset两个坑超时~~

  • 相关阅读:
    软工假期预习作业1
    2号团队-团队任务4:每日立会(汇总)
    2号团队-团队任务4:每日立会(2018-11-26)
    2号团队-团队任务4:每日立会(2018-11-27)
    第二小组首次会议记录
    第二次作业
    自我介绍+课后作业1:准备
    Linux安装redis
    Redis面试题
    Mybatis面试题
  • 原文地址:https://www.cnblogs.com/dancer16/p/7324666.html
Copyright © 2011-2022 走看看