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 <>, {}, [], (). ...
随机推荐
- 洛谷 P2863 [USACO06JAN]牛的舞会The Cow Prom
传送门 题目大意:形成一个环的牛可以跳舞,几个环连在一起是个小组,求几个小组. 题解:tarjian缩点后,求缩的点包含的原来的点数大于1的个数. 代码: #include<iostream&g ...
- 十九、python沉淀之路--装饰器
一.实现装饰器的预备知识 装饰器 = 高阶函数 + 函数嵌套 + 闭包 1.高价函数定义: 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个,都可称之 ...
- 前端mvc mvp mvvm 架构介绍(vue重构项目一)
首先 我们为什么重构这个项目 1:我们现有的技术是前后台不分离,页面上采用esayUI+jq构成的单页面,每个所谓的单页面都是从后台胜场的唯一Id 与前端绑定,即使你找到了那个页面元素,也找不到所在的 ...
- Six Basic Functional Areas of Spring
- dpkg安装工具
dpkg --info "软件包名" --列出软件包解包后的包名称. dpkg -l --列出当前系统中所有的包.可以和参数less一起使用在分屏查看. (类似于rpm -qa) ...
- java中split的用法即回顾
package com.b; public class Cor { public static void main(String[] args) { String a = "this is ...
- linux平台总线驱动设备模型之点亮LED
这一节里,我们来使用平台驱动设备这一套架构来实现我们之前使用简单的字符设备驱动点亮LED,这里并无实际意义,只是告诉大家如果编写平台总线驱动设备. 问:如何编写平台总线驱动设备这一套架构的设备驱动? ...
- 给安卓端调用的apk、图片下载接口
package com.js.ai.modules.pointwall.action; import java.io.File; import java.io.FileInputStream; imp ...
- mac下自定义伪协议配置
之前查了很多资料,最近也在挖掘研究这方面的漏洞. windows的很简单,在注册表配置就好了,但是mac os 是unix的,没有注册表这么一说. 但是发现腾讯等配置了自定义等协议,例如:tencen ...
- 爬取豆瓣电影Top250信息
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import requests from pyquery import PyQ ...