博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杭电多校第一场补题-1002 Balanced Sequence
阅读量:6819 次
发布时间:2019-06-26

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

题意:给定n个字符串,n的大小在1e5左右,字符串的长度也是1e5,字符串仅由‘(’或‘)’组成,合法串可以不是连续的,将这n个串按照一定的顺序排列起来,使得组合之后的字符串的合法串的长度最长。n*len的大小是1e6

思路:首先n*len的处理出来每一个字符串中合法的长度,处理的办法可以参考之前栈的想法,每遇见一个')',就判断前面‘(’的个数,只要不为0,此时就可以合成一个合法串,处理完之后可以得到剩下的‘)’和‘(’的个数,然后所有的n个串进行排序,最后将这些))((())((。。。。。))(((的串连接起来即可,排序的方式是)少(多的放在前面,反之放在后面,如果差不多的话,就根据))排序。

代码如下:

#include
#include
#include
#include
using namespace std;const int maxn = 100005;int t;int n;char s[maxn];struct NODE{ int l; int r; int sum; bool operator < (const NODE &b) const { if(l>=r && b.l<=b.r) return false; else if(l<=r && b.l>=b.r) return true; else if(l>=r && b.l>=b.r) return r>=b.r; else if(l<=r && b.l<=b.r) return l<=b.l; }} node[maxn];int main(){ scanf("%d", &t); while( t-- ) { scanf("%d", &n); for(int cnt=0; cnt
0) { node[cnt].r --; node[cnt].sum ++; } else { node[cnt].l++; } } else { node[cnt].r++; } } } sort(node, node+n); int ans; int now; ///now记录现在有多少个‘(’ ans = now = 0; for(int i=0; i
=now) { ans += now; now = node[i].r; } else { ans += node[i].l; now -= node[i].l; now += node[i].r; } } printf("%d\n", ans*2); } return 0;}

 

转载于:https://www.cnblogs.com/Flower-Z/p/9357381.html

你可能感兴趣的文章
Linux更改权限笔记
查看>>
【MySql 大数据量快速插入和语句优化】
查看>>
关于“let: not found”
查看>>
yum安装报错“Error: xz compression not available”
查看>>
Android开发中如何改变RadioButton背景图片和文字的相对位置
查看>>
如何给Linux (Fedora Ubuntu等)安装字体
查看>>
MySQL大小写敏感问题和命名规范
查看>>
java 获取时间 和 转换时间
查看>>
Redis主从复制
查看>>
mysql-5.6.26 主主复制
查看>>
Python-高阶函数
查看>>
SpringMVC权限管理
查看>>
ET120以太网环回器介绍
查看>>
ActiveMQ快速入门
查看>>
java自学篇之程序设计基础
查看>>
swiper的基础使用(五)
查看>>
Windows Server 2012R2 Hyper-v之虚拟机复制(2)
查看>>
大数据各种实用网站
查看>>
Linux系统启动过程
查看>>
使用Dnsmasq 部署GPXE 安装 Centos7
查看>>