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 <>, {}, [], (). ...
随机推荐
- 剑指offer-第五章优化时间和空间效率(两个链表的第一个公共节点)
思路1:要求的是两个链表的第一个公共节点,首先想到的是用栈来存放两个链表,然后依次从栈中抛出,直到最后一个相同的节点为止.但是要用到两个栈,空间复杂度为O(n): 思路2:从头到尾分别遍历两个链表得到 ...
- LeetCode IPO
原题链接在这里:https://leetcode.com/problems/ipo/description/ 题目: Suppose LeetCode will start its IPO soon. ...
- C#网络编程(异步传输字符串) - Part.3
这篇文章我们将前进一大步,使用异步的方式来对服务端编程,以使它成为一个真正意义上的服务器:可以为多个客户端的多次请求服务.但是开始之前,我们需要解决上一节中遗留的一个问题. 消息发送时的问题 这个问题 ...
- Oracle记录(四) 简单查询、限定查询、数据的排序
一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统.ANSI(美国国家标准学会) ...
- svn配置及基本使用
svn软件下载地址http://subversion.apache.org/packages.html在安装TortoiseSVN时安装客户端和服务端 下以svn在windows下使用为例,linux ...
- ffmpeg摄像头采集h264编码RTP发送
一. 相关API说明 1. av_register_all 2. avformat_network_init 不管是流媒体发送还是流媒体接收, 需要先执行该函数. 3. avformat_alloc_ ...
- 【转】Jmeter参数化
参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...
- jdk8的扩展注解
对于注解(也被称做元数据),Java 8 主要有两点改进:类型注解和重复注解. 1.类型注解 1)Java 8 的类型注解扩展了注解使用的范围. 在java 8之前,注解只能是在声明的地方所使用,ja ...
- VC++使用TCHAR
#ifdef _UNICODE #define tcout wcout #define tcin wcin #else #define tcout cout #define tcin cin #end ...
- SQL语句替换字段内容例子
SELECT REPLACE(SysFuncID,'7201','7204') , CASE WHEN Flag=1 THEN REPLACE(funcname ...