ZR#331. 【18 提高 3】括号序列(栈)
题意

挺神仙的。首先$60$分暴力是比较好打的。
就是枚举左端点,看右端点能否是$0$
但是这样肯定是过不了的,假如我们只枚举一次,把得到的栈记录下来
那么若区间$(l, r)$是可行的,那么$s_{l - } = s_r$,证明自己yy一下吧。。
然后就是字符串hash乱搞了。。
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<map>
#define LL long long
#define ull unsigned long long
using namespace std;
const int MAXN = 1e6 + , mod = 1e9 + ;
inline LL read() {
char c = getchar(); LL x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
char a[MAXN], s[MAXN];
int top = ;
ull base = , base2 = , po1[MAXN], po2[MAXN];
map<ull, LL> mp;
int main() {
scanf("%s", a + );
LL N = strlen(a + ), ans = ;
ull sum = , sum2 = ;
mp[] = ; po1[] = ; po2[] = ;
for(int i = ; i <= N; i++) po1[i] = po1[i - ] * base, po2[i] = po2[i - ] * base2;
for(int i = ; i <= N; i++) {
if(top && a[i] == s[top]) {
top--;
sum -= po1[top] * (a[i] - 'a' + );
sum2 -= po2[top] * (a[i] - 'a' + ); }
else {
sum += po1[top] * (a[i] - 'a' + );
sum2 += po2[top] * (a[i] - 'a' + ) ;
s[++top] = a[i];
}
ans += mp[(sum << ) + sum2];
mp[(sum << ) + sum2]++;
// printf("%d\n", ans);
}
printf("%lld", ans);
return ;
}
/*
abaababababbbbbaavbaaaabbbaaaabbabbbaabbabbb
*/
ZR#331. 【18 提高 3】括号序列(栈)的更多相关文章
- Catalan数,括号序列和栈
全是入门的一些东西.基本全是从别处抄的. 栈: 支持单端插入删除的线性容器. 也就是说,仅允许在其一端加入一个新元素或删除一个元素. 允许操作的一端也叫栈顶,不允许操作的一端也叫栈底. 数个箱子相叠就 ...
- 栈+括号序列+暴力枚举——cf1248D1
这个复杂度首先就想到是n3的复杂度,n2枚举换的位置,求值在花费n复杂度 判断一个序列有多少独立的括号子串时用栈处理一下即可 /* 枚举交换两个括号的位置,然后再对新的序列判一次即可 */ #incl ...
- 洛谷 P1241 括号序列(栈)
嗯... 题目链接:https://www.luogu.org/problem/P1241 首先这道题是栈的入门题的加强版, 不仅要你判断这个括号序列是否合法,还要你将这个序列补充完整... 一开始是 ...
- lintcode: 有效的括号序列
题目: 有效的括号序列 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and']', 判定是否是有效的括号序列. 样例 括号必须依照 "() ...
- 洛谷 P1241 括号序列
P1241 括号序列 题目描述 定义如下规则序列(字符串): 1.空序列是规则序列: 2.如果S是规则序列,那么(S)和[S]也是规则序列: 3.如果A和B都是规则序列,那么AB也是规则序列. 例如, ...
- UVA-673 括号匹配--栈
如果是一个合法的序列,每对配对的括号的两个字符('(' 和 ')' 或者 '[' 和 ']')一定是相邻的,每次判断下该字符是否有配对即可. 如果配对,将左括号出栈即可.特别注意:空格也是合法的. A ...
- 有效的括号序列——算法面试刷题4(for google),考察stack
给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列. 括号必须依照 "()" 顺序表示, & ...
- [leetcode]20. Valid Parentheses有效括号序列
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- 【BZOJ】1095: [ZJOI2007]Hide 捉迷藏 括号序列+线段树
[题目]BZOJ 1095 [题意]给定n个黑白点的树,初始全为黑点,Q次操作翻转一个点的颜色,或询问最远的两个黑点的距离,\(n \leq 10^5,Q \leq 5*10^5\). [算法]括号序 ...
随机推荐
- std::ostringstream 转std::string
http://www.cplusplus.com/reference/sstream/ostringstream/ https://en.cppreference.com/w/cpp/io/basic ...
- 面向对象(this关键字)
package com_package2; public class Person3 { private int age; private String name; public int getAge ...
- 【opencv学习笔记四】opencv3.4.0图形用户接口highgui函数解析
在笔记二中我们已经知道了,在highgui文件夹下的正是opencv图形用户接口功能结构,我们这篇博客所说的便是D:\Program Files\opencv340\opencv\build\incl ...
- java去任意范围的随机数
一.java.uitl.Randomrandom.nextInt(20),任意取[0,20)之间整数,其中0可以取到,20取不到 二.取某个范围的任意数public static String get ...
- Java keytool命令说明
Java keytool命令说明 Java 中的 keytool.exe (位于 JDK\Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中 ...
- Regex Golf 练习记录
正则表达式的练习网站:https://alf.nu/RegexGolf 共17道题:只能说从第10题开始就很变态了,就是看看答案好了 .Warmup: foo .Anchors: k$ 或 ick$ ...
- C++ 无边框的拖动窗口代码
按下鼠标时,记录下鼠标在窗体上的坐标, 同时用一个BOOL变量记录下鼠标左键按下的状态 弹起左键,则记录状态的布尔变量为FALSE. 处理鼠标移动事件,如果左键同时按下,则为鼠标拖动窗体运动,设置窗体 ...
- 开源:基于Android的室内定位WiFi,iBeacon数据采集和定位脚本
最近有同学联系我,也在一些群里看到有新手同学挣扎在怎么获取定位数据,不知从何下手.所以整理并开源这个基于Android的数据采集软件和基于python的KNN定位demo,算是为新手同学建立一个Bas ...
- QxOrm 1.2.9 下载 以及编译方法 简介.
QxOrm 是一个基于QT开发的数据库方面的ORM库,功能很强大,是QT C++数据开发方面的好工具. 目前已经更新1.3.1 .但 不幸的是 它的官网http://www.qxorm.com/ 莫名 ...
- Python 获取脚本路径以及脚本所在文件夹路径
import os script_path = os.path.realpath(__file__) script_dir = os.path.dirname(script_path)