合法括号子段

来源:互联网 发布:传智播客 云计算大数据 编辑:程序博客网 时间:2024/05/16 12:48

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

合法括号序列的定义是:

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

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



Input
多组测试数据。
第一行有一个整数T(1<=T<=1100000),表示测试数据的数量。
接下来T行,每一行都有一个括号序列,是一个由'('和')'组成的非空串。
所有输入的括号序列的总长度不超过1100000。
Output
输出T行,每一行对应一个测试数据的答案。
Sample Input
5(()()()(()(())
Sample Output
01312
代码:

#include<stdio.h>#include<string.h>#include<stack>#define MAX 1100005using namespace std;typedef long long ll;ll num[MAX],ans;//num[i],i之前有几个完整的括号char str[MAX];stack<int>s;ll T;int main(){    scanf("%lld",&T);    while(T--){      //  memset(num,0,sizeof(num));//也花费一定的时间,加上会超时        while(!s.empty()) s.pop();        ans=0;        scanf("%s",str+1);        ll len=strlen(str+1);        ll i;        for(i=1;i<=len;i++){            if(str[i]=='('){                num[i]=0;                s.push(i);            }            else{                if(s.empty()){                    num[i]=0;                    continue;                }                ans+=num[s.top()-1]+1;                num[i]=num[s.top()-1]+1;            //    printf("%lld : %lld %lld\n",i,ans,num[i]);                s.pop();            }        }        printf("%lld\n",ans);    }return 0;}


原创粉丝点击