给你一个由小写字母组成的字符串s,要你构造一个字典序最小的(认为左括号的字典序比右括号小)合法的括号
序列与这个字符串匹配,字符串和括号序列匹配定义为:首先长度必须相等,其次对于一对匹配的左括号和右括号
i,j,必须有s[i]==s[j]
无解输出-
Input
一行一个字符串s <=n<=
Output
一行一个括号序列或者- Sample Input
abbaaa
Sample Output
(()())
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int num[],used[];
char c[maxn],ans[maxn];
int main()
{
int L,i;
scanf("%s",c+);
L=strlen(c+);
for(i=;i<=L;i++) num[c[i]-'a']++;
for(i=;i<;i++){
if(num[i]%==) {
puts("-1");
return ;
}
}
for(i=;i<=L;i++){
if(used[c[i]-'a']<num[c[i]-'a']/) ans[i]='(';
else ans[i]=')';
used[c[i]-'a']++;
}
for(i=;i<=L;i++) putchar(ans[i]);
return ;
}

一开始交了发贪心,WA了,才想起来贪心的话,会导致匹配的时候不一定满足s[i]==s[j]    尴尬==

然后看别人说是分治。

分治: 每次按照栈的合法性(用hash记录),对于[L,R],找到最远匹配的地方pos,使得char[L]==char[pos],且[L+1,pos-1],[pos+1,R]分别匹配。然后再以大化小解决小区间。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=;
const int seed=;
const int Mod=1e9+;
map<int,int>Laxt[];
char c[maxn],ans[maxn];
int Next[maxn],q[maxn],top,hash[maxn],fac[maxn];
void solve(int L,int R)
{
if(L>=R) return ;
int pos=Laxt[c[L]-'a'][hash[L-]];
while(ans[pos]=='('||ans[pos]==')') pos=Next[pos];//没加这一句TLE了很多次,why
Laxt[c[L]-'a'][hash[L-]]=Next[pos];
ans[L]='('; ans[pos]=')';
solve(pos+,R);
solve(L+,pos-);
}
int main()
{
int N,i,j,now=;
scanf("%s",c+);
N=strlen(c+);
fac[]=; for(i=;i<=N;i++) fac[i]=(ll)fac[i-]*seed%Mod;
for(i=;i<=N;i++){ //hash里面,最高位才可以用来加减。
if(top&&c[q[top]]==c[i]){
((now-=(ll)fac[top-]*(c[i]-'a'+)%Mod))%=Mod,--top;
if(now<) now+=Mod;
}
else (now+=(ll)(c[i]-'a'+)*fac[top]%Mod)%=Mod,q[++top]=i;
hash[i]=now;
}
for(i=;i<=N;i++){
Next[i]=Laxt[c[i]-'a'][hash[i]];
Laxt[c[i]-'a'][hash[i]]=i;
}
if(top!=) { puts("-1"); return ;}
solve(,N);
for(i=;i<=N;i++) putchar(ans[i]);
return ;
}

BZOJ4936:match (不错的分治)的更多相关文章

  1. 循环比赛日程表(match)(分治)

    [问题描述]     设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空.     输入:M     输 ...

  2. [Ceoi2016|BZOJ4936] Match

    哈希+分治+stack 题目: 给你一个由小写字母组成的字符串s,要你构造一个字典序最小的(认为左括号的字典序比右括号小)合法的括号 序列与这个字符串匹配,字符串和括号序列匹配定义为:首先长度必须相等 ...

  3. 2019.01.14 bzoj2648: SJY摆棋子(kd-tree)

    传送门 kd−treekd-treekd−tree模板题. 题意简述:支持在平面上插入一个点,求对于一个点的最近点对. 思路:cdqcdqcdq是一种很不错的分治方法 只是好像码量有点窒息 所以我用了 ...

  4. CF981H K Paths

    CF981H K Paths 题解 一道不错的分治ntt题目 题目稍微转化一下,就是所有k条链的存在交,并且交的部分都被覆盖k次 所以一定是两个点,之间路径选择k次,然后端点两开花 f[x]表示x子树 ...

  5. 羽夏 Bash 简明教程(下)

    写在前面   该文章根据 the unix workbench 中的 Bash Programming 进行汉化处理并作出自己的整理,并参考 Bash 脚本教程 和 BashPitfalls 相关内容 ...

  6. elasticsearch 查询(match和term)

    elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL). 由于DSL查询更为直观也更为简 ...

  7. ACdream1157 Segments(CDQ分治 + 线段树)

    题目这么说的: 进行如下3种类型操作:1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]2)C i (1-base) 删除第i条增加的线段, ...

  8. 很不错的jQuery学习资料和实例

    这些都是学习Jquery很不错的资料,整理了一下,分享给大家. 希望能对大家的学习有帮助. 帕兰 Noupe带来的51个最佳jQuery教程和实例, 向大家介绍了jQuery的一些基本概念和使用的相关 ...

  9. JavaScript中String对象的match()、replace() 配合正则表达式使用

    正则表达式由来已久,查找替换功能非常强大,但模板难记复杂. JavaScript中String对象的match().replace()这2个方法都要使用正则表达式的模板.当模板内容与字符串不相匹配时, ...

随机推荐

  1. 前言(CSDN也有Markdown了,好开森)

    实战出精华 在具体的C++网络编程中提升你的逼格 John Torjo Boost.Asio C++ 网络编程 Copyright © 2013 Packt Publishing 关于作者 做为一名权 ...

  2. icmp的程序(ping的实现)

    code来源于<网络编程与分层协议设计> chap7 ICMP协议程序设计 ----没有理解,没有编译,只是敲了出来 ping.h #define ICMP_ECHOREPLY 0#def ...

  3. 【每日Scrum】第一天(4.11) TD学生助手Sprint1计划会议成果

    [每日Scrum]第一天  TD学生助手Sprint1计划会议成果 ——小组成员:刘铸辉 刘静 何晓楠 谢凤娇 胡宝月 王洪叶 初次尝试敏捷开发Scrum计划流程开发项目,有什么不对的地方还希望各位大 ...

  4. javascript 高级编程系列 - 基本数据类型

    javascript中的基本数据类型包括: Undefined, Null, Boolean, Number, String 5种数据类型 1. Undefined 类型 (只有一个值 undefin ...

  5. 【网络协议】TCP的流量控制机制

    一般来说,我们总是希望传输数据的更快一些,但假设发送方把数据发送的非常快.而接收方来不及接收,这就可能造成数据的丢失.流量控制就是让发送方的发送速率不要太快.让接收方来得及接收. 对于成块数据流,TC ...

  6. Django-缓存的配置

    缓存的介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗 ...

  7. angular 绑定数据时添加HTML标签被识别的问题

    由于安全性,angular本身会对绑定的HTML标签属性进行转义,所以有些情况下我们需要用到绑定的数据里面传入html标签的时候, 需要用到一个服务:$sce $sce 服务下面的一个 $sce.tr ...

  8. 字符串转换成js的日期格式

    js字符串转日期格式 ,JavaScript字符串转日期格式 大家都知道JS是根据结果来确定数据类型的. 当然我们也是可以转化的,下面我就介绍两种关于JS字符串类型转换成日期类型的方法, 我个人比较喜 ...

  9. 如何清除本地DNS缓存 windows

    在您的网站迁移服务器时需要对域名所指向的IP进行更改,这时候在本机访问网站时就需要清除本地的DNS缓存信息,那么怎样清除呢? 首先我们应该明白清除DNS缓存信息的原理:当计算机对域名访问时并不是每次访 ...

  10. CIDR(无类域间路由)(转载)

    来源:百度百科 CIDR(无类型域间选路,Classless Inter-Domain Routing)是一个在Internet上创建附加地址的方法,这些地址提供给服务提供商(ISP),再由ISP分配 ...