传送门

题目大意

给定有一个长度为n

n的括号序列,现在有两种操作:

  1. 在任意一个位置插入有一个左括号或右括号
  2. 将末尾的一个括号放到最前面

可以对这个序列进行若干次操作,问在使括号序列合法的前提下,长度最短是多少,如果有多组解,输出字典序最小的

分析

首先最后的长度一定等于(原字符串长度+左括号与右括号数量的差值),现在我们考虑让其的字典序尽量的小

我们预处理前缀和,’(‘为+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的更多相关文章

  1. UESTC 1546 Bracket Sequence

                                        Bracket Sequence Time Limit: 3000MS   Memory Limit: 65536KB   64 ...

  2. CF#138 div 1 A. Bracket Sequence

    [#138 div 1 A. Bracket Sequence] [原题] A. Bracket Sequence time limit per test 2 seconds memory limit ...

  3. CodeForces 670E Correct Bracket Sequence Editor(list和迭代器函数模拟)

    E. Correct Bracket Sequence Editor time limit per test 2 seconds memory limit per test 256 megabytes ...

  4. 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 ...

  5. 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 ...

  6. (中等) UESTC 94 Bracket Sequence,线段树+括号。

    There is a sequence of brackets, which supports two kinds of operations. we can choose a interval [l ...

  7. Replace To Make Regular Bracket Sequence

    Replace To Make Regular Bracket Sequence You are given string s consists of opening and closing brac ...

  8. CF1095E Almost Regular Bracket Sequence

    题目地址:CF1095E Almost Regular Bracket Sequence 真的是尬,Div.3都没AK,难受QWQ 就死在这道水题上(水题都切不了,我太菜了) 看了题解,发现题解有错, ...

  9. D - Replace To Make Regular Bracket Sequence

    You are given string s consists of opening and closing brackets of four kinds <>, {}, [], (). ...

随机推荐

  1. 七、Jmeter + ant + jenkins轻量级接口自动化测试

    七.Jmeter + ant + jenkins轻量级接口自动化测试 杀猪不用牛刀,工具没有牛逼高大尚之分,每个工具都有存在的理由:关键是看会不会用,怎么用,有没有用在合适的地方. 需要安装的工具: ...

  2. base64图片上传,并根据不同项目进行智能修改图片

    前台传图片的base64格式,后台处理方式//处理图片信息 返回对应的路径public function uploadBaseIma($imgArr){ $result = array(); //将路 ...

  3. Memcached数据存储方式

    1. memcached的数据存储方式被称为Slab Allocator,其基本方式是: ①:先把内存分成很多Slab,这个大小是预先规定好的,已解决内存碎片的问题.分配给Slab的内存空间被称为Pa ...

  4. java多线程练习实例

    总结: 循环的使用率蛮高,Thraed.sleep(),try-catch语句 package com.aa; public class West { public static void main( ...

  5. java中关于length的真确理解~~~~有补充的请跟帖~~~

    java中的length到底是个什么东西呢?有人说它是一个类,一个方法,如果是方法,它没有括号, 我只知道它可以得出数组的长度,但是今天遇到一段代码,怎么都解释不通,那就是绝对不会把循环的次数与数组的 ...

  6. ByteBuf 类——Netty 的数据容器

    1.堆缓冲区 2.直接缓冲区 3.复合缓冲区 —CompositeByteBuf——实现了这个模式,它提供了一 个将多个缓冲区表示为单个合并缓冲区的虚拟表示 适用于 JDK 所使用的一种称为分散/收集 ...

  7. ejs的简单应用

    获取数据 var init = function(){ api.my_bean_list({ },function(datas){ console.log(datas); if (datas.errn ...

  8. 第七章 JVM体系结构与工作方式

    JVM能跨计算机体系结构来执行Java字节码,主要是由于JVM屏蔽了与各个计算机平台的软件和硬件之间的差异. 7.1 JVM体系结构 7.1.1 何谓JVM 模拟一个计算机来达到一个计算机所具有的计算 ...

  9. DRF之解析器组件及序列化组件

    知识点复习回顾一:三元运算 三元运算能够简化我们的代码,  请看如下代码: # 定义两个变量 a = 1 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达 ...

  10. 不需要SDK调用图灵机器人的方法

    图灵机器人的调用其实就是你给服务器发一个文字消息过去,他回你一个,看起来模仿人类对话一样. 不知道为什么要弄个SDK这么麻烦的方法,以前的接口官网上已经没有了,但是还是可以用的.返回的是JSON但也懒 ...