本文共 961 字,大约阅读时间需要 3 分钟。
有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列。
合法括号序列的定义是:
1.空序列是合法括号序列。
2.如果S是合法括号序列,那么(S)是合法括号序列。
3.如果A和B都是合法括号序列,那么AB是合法括号序列。多组测试数据。第一行有一个整数T(1<=T<=1100000),表示测试数据的数量。接下来T行,每一行都有一个括号序列,是一个由'('和')'组成的非空串。所有输入的括号序列的总长度不超过1100000。
输出T行,每一行对应一个测试数据的答案。
5(()()()(()(())
01312
这里,我们需要明确区分一个定义,什么叫做子段?什么叫做子序列?子段是子序列的一种,也叫做连续子序列,而子序列呢?如果不要求连续,则是可以从原序列中任意取,但是要保持原先的先后顺序即可。
一个简单的分治,分别控制子段的左右两端点在左右两个区间内,然后从中间开始查找,控制左右两个半区间的合法性即可。
下面给出AC代码:
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 typedef long long ll; 9 const int maxn = 1100005;10 int dp[maxn];11 char s[maxn];12 int main (void)13 {14 ios::sync_with_stdio(false);15 int n;16 scanf("%d",&n);17 for(int k=1;k<=n;++k)18 {19 scanf("%s",s);20 stack st;21 int len=strlen(s);22 for(int i=0;i
转载地址:http://rnzfa.baihongyu.com/