博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51 Nod 1791 合法括号子段【分治+字符串】
阅读量:6150 次
发布时间:2019-06-21

本文共 961 字,大约阅读时间需要 3 分钟。

基准时间限制:1 秒 空间限制:131072 KB 分值: 40

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

合法括号序列的定义是:

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

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

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

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

这里,我们需要明确区分一个定义,什么叫做子段?什么叫做子序列?子段是子序列的一种,也叫做连续子序列,而子序列呢?如果不要求连续,则是可以从原序列中任意取,但是要保持原先的先后顺序即可。

一个简单的分治,分别控制子段的左右两端点在左右两个区间内,然后从中间开始查找,控制左右两个半区间的合法性即可。

下面给出AC代码:

1 #include 
2 #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/

你可能感兴趣的文章
常用限制input的方法
查看>>
IIS7下使用urlrewriter.dll配置
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>
angularjs表达式中的HTML内容,如何不转义,直接表现为html元素
查看>>
css技巧
查看>>
Tyvj 1728 普通平衡树
查看>>
javascript性能优化
查看>>
多路归并排序之败者树
查看>>
java连接MySql数据库
查看>>
转:Vue keep-alive实践总结
查看>>
深入python的set和dict
查看>>