529A And Yet Another Bracket Sequence
题目大意
给定有一个长度为n
n的括号序列,现在有两种操作:
- 在任意一个位置插入有一个左括号或右括号
- 将末尾的一个括号放到最前面
可以对这个序列进行若干次操作,问在使括号序列合法的前提下,长度最短是多少,如果有多组解,输出字典序最小的
分析
首先最后的长度一定等于(原字符串长度+左括号与右括号数量的差值),现在我们考虑让其的字典序尽量的小
我们预处理前缀和,’(‘为+1,’)'为-1
我们可以发现,最终的答案一定是从序列中的某一位开始循环n
n次,最后补上需要补足的括号数的,然后我们就只需要查找长度为n
n的子串中合法且最小的那串
判断合法的过程可以用hash+二分
二分的是两个字符串第一个不一样的地方
实际还有后缀数组做法,然后先咕了
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define uli long long
const uli hsh = ;
const uli hsh2 = ;
const uli mod = 1e9+;
const uli mod2 = ;
int n,m;
string s,t;
char c[];
uli pw[],h[],pw2[],h2[];
int sum[],pre[],sur[],le,ri;
inline pair<uli,uli> v(int l,int r){
return make_pair((h[r]-(l?h[l-]:)*pw[r-l+]%mod+mod)%mod,
(h2[r]-(l?h2[l-]:)*pw2[r-l+]%mod2+mod2)%mod2);
}
inline bool ck(int i,int j){
int l=,r=m;
while(r-l>){
int mid=(l+r)>>;
if(i+mid->=m||j+mid->=m||v(i,i+mid-)!=v(j,j+mid-))r=mid;
else l=mid;
}
if(i+r->=m||j+r->=m)return ;
return t[i+r-]<t[j+r-];
}
int main(){
int i,j,k;
scanf("%s",c);
s=c;
t=s+s;
n=s.length();
m=t.length();
pw[]=;
for(i=;i<=m;i++)pw[i]=pw[i-]*hsh%mod;
h[]=t[];
for(i=;i<m;i++)h[i]=(h[i-]*hsh+t[i])%mod;
pw2[]=;
for(i=;i<=m;i++)pw2[i]=pw2[i-]*hsh2%mod2;
h2[]=t[];
for(i=;i<m;i++)h2[i]=(h2[i-]*hsh2+t[i])%mod2;
for(i=;i<n;i++)sum[i]=(i?sum[i-]:)+(s[i]=='('?:-);
pre[]=sum[],sur[n-]=sum[n-];
for(i=;i<n;i++)pre[i]=min(sum[i],pre[i-]);
for(i=n-;i>=;i--)sur[i]=min(sum[i],sur[i+]);
int maxl=1e9+,pl=-;
if(sum[n-]<)le=-sum[n-];
else ri=sum[n-];
for(i=;i<n;i++){
k=(i?sum[i-]:);
int w=min(sur[i]-k,sum[n-]-k+(i?pre[i-]:));//重点!!!
int ll=max(-w,max(,-sum[n-]));
if(ll+ri+n<maxl){
maxl=ll+ri+n;
le=ll;
pl=i;
}else if(ll+ri+n==maxl&&ck(i,pl)){
pl=i;
}
}
for(i=;i<=le;i++)cout<<"(";
for(i=pl;i<n;i++)cout<<s[i];
for(i=;i<pl;i++)cout<<s[i];
for(i=;i<=ri;i++)cout<<")";
return ;
}
529A And Yet Another Bracket Sequence的更多相关文章
- UESTC 1546 Bracket Sequence
Bracket Sequence Time Limit: 3000MS Memory Limit: 65536KB 64 ...
- CF#138 div 1 A. Bracket Sequence
[#138 div 1 A. Bracket Sequence] [原题] A. Bracket Sequence time limit per test 2 seconds memory limit ...
- CodeForces 670E Correct Bracket Sequence Editor(list和迭代器函数模拟)
E. Correct Bracket Sequence Editor time limit per test 2 seconds memory limit per test 256 megabytes ...
- Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈
C. Replace To Make Regular Bracket Sequence 题目连接: http://www.codeforces.com/contest/612/problem/C De ...
- Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp
C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...
- (中等) UESTC 94 Bracket Sequence,线段树+括号。
There is a sequence of brackets, which supports two kinds of operations. we can choose a interval [l ...
- Replace To Make Regular Bracket Sequence
Replace To Make Regular Bracket Sequence You are given string s consists of opening and closing brac ...
- CF1095E Almost Regular Bracket Sequence
题目地址:CF1095E Almost Regular Bracket Sequence 真的是尬,Div.3都没AK,难受QWQ 就死在这道水题上(水题都切不了,我太菜了) 看了题解,发现题解有错, ...
- D - Replace To Make Regular Bracket Sequence
You are given string s consists of opening and closing brackets of four kinds <>, {}, [], (). ...
随机推荐
- Arcgis Desktop连接GIS Servers报错“Proxy server got bad address from remote server ...”
今天打开Arcgis Desktop时突然发现连接GIS Servers报错“Proxy server got bad address from remote server ...” 网上查找到解决方 ...
- 【sqlite】基础知识
最近做一个数控系统的项目,winCE嵌入式操作系统+.Net Compact Framework环境+VS2008开发平台,开发的设备程序部署到winCE系统下的设备中运行.. 个年头,SQLite也 ...
- 转载 iir直接i型和直接ii型滤波器
1.IIR滤波器构造 之前在介绍FIR滤波器的时候,我们提到过,IIR滤波器的单位冲击响应是无限的!用差分方程来表达一个滤波器,应该是下式这个样子的. ...
- AbstractIdleService
该类有一个startup和shutdown方法,启动此服务或者结束此服务的时候可以调用. Runtime.getRuntime().addShutdownHook(new Thread() {@Ove ...
- 生产环境连接数据库失败:Cannot create PoolableConnectionFactory❨Got mins one from a read call❩
生产环境发现有接口调不通,而且集中在两个节点,其他节点都没问题.抓取日志发现报错如下: Context initialization failed. org.springframework. bean ...
- delphi xe5 安卓 配置sqlite
本篇我们介绍一下在android手机上怎样使用sqlite数据库,这里用Navigator实现 增删改查. 1.新建firemonkey mobile application 2.选择blank ap ...
- CAN总线位仲裁技术
CAN总线位仲裁技术 只要总线空闲,任何单元都可以开始发送报文. 要对数据进行实时处理,就必须将数据快速传送,这就要求数据的物理传输通路有较高的速度.在几个站同时需要发送数据时,要求快速地进行总线分配 ...
- Mac电脑Tomcat下载及安装(详细)
下载Tomcat 1.打开Apache Tomcat官网,选择你需要的版本进行下载: 地址http://tomcat.apache.org/download-70.cgi 2.解压apache-t ...
- java代码实现从键盘输入编号,输出价格,并且不再编号内的,无效输入!!!!
总结:请给我更好的建议 package com.badu; import java.util.Scanner; //从键盘输入次数,通过输入的编号,输出对应的的商品价格: public class t ...
- JetBrains ReSharper Ultimate 2017.2.2激活方法
先提供两个链接, 需要直接拿去用即可 第一个: http://xidea.online 第二个: http://idea.iteblog.com/key.php (我用的这个) 方法下图: 继续: ...