CF653F. Paper task
CF653F. Paper task
简要题面
给定括号序列SSS,求其中本质不同合法括号序列个数。(∣S∣≤5∗105|S|\leq 5*10^5∣S∣≤5∗105)
Solution
感觉用了一个很麻烦的方法。
我们可以考虑枚举本质不同串的右端点,每次动态地在SAMSAMSAM里面加入末尾元素,新增的本质不同后缀个数rrr即为lenlst−lenfa[lst]len_{lst}-len_{fa[lst]}lenlst−lenfa[lst],显然新增的本质不同串的起点是[1,r][1,r][1,r],终点是iii。
现在我们考虑有多少起点在[1,r][1,r][1,r]中的序列合法,我们对于1..i1..i1..i做一个括号匹配,倘若有左括号没被消掉,则起点只可能在没消掉的左括号右边,令l=max(stk[i])l=max(stk[i])l=max(stk[i]),表示最右边的未消掉的左括号。
此时起点在[l+1,r][l+1,r][l+1,r]的串显然只需要满足一个条件——左右括号个数相等即可(因为此时左括号个数不可能多于右括号),因此建一个线段树维护区间内左右括号个数差即可。
Code
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-15;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=1e9+7;
const int MAXN=500005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
char st[MAXN];
int n,s[MAXN],stk[MAXN],top=0;
PR S[MAXN<<2];
void build(int x,int l,int r)
{if (l==r) { S[x]=MP(s[l],1); return; }int mid=(l+r)>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);S[x].fi=min(S[x<<1].fi,S[x<<1|1].fi),S[x].se=0;if (S[x].fi==S[x<<1].fi) S[x].se+=S[x<<1].se;if (S[x].fi==S[x<<1|1].fi) S[x].se+=S[x<<1|1].se;
}
PR query(int x,int l,int r,int L,int R)
{if (l>=L&&r<=R) return S[x];int mid=(l+r)>>1;if (R<=mid) return query(x<<1,l,mid,L,R);else if (L>mid) return query(x<<1|1,mid+1,r,L,R);else{PR X=query(x<<1,l,mid,L,mid),Y=query(x<<1|1,mid+1,r,mid+1,R);if (X.fi==Y.fi) return MP(X.fi,X.se+Y.se);return (X.fi<Y.fi)?X:Y;}
}
int len[MAXN<<1],t[MAXN<<1][2],fa[MAXN<<1],sz=2,lst=1;
void insert(int c)
{int p=lst,np=lst=sz++;len[np]=len[p]+1;for (;p&&!t[p][c];p=fa[p]) t[p][c]=np;if (!p) { fa[np]=1; return; }int q=t[p][c];if (len[q]==len[p]+1) fa[np]=q;else{int nq=sz++;len[nq]=len[p]+1;fa[nq]=fa[q];fa[np]=fa[q]=nq;memcpy(t[nq],t[q],sizeof t[0]);for (;t[p][c]==q;p=fa[p]) t[p][c]=nq;}
}
signed main()
{n=read();scanf("%s",st+1);for (int i=1;i<=n;i++) s[i]=s[i-1]+(st[i]=='('?1:-1);build(1,0,n-1);ll ans=0;for (int i=1;i<=n;i++){if (st[i]=='(') stk[++top]=i;else if (top) stk[top--]=0;int l=stk[top]+1;insert(st[i]==')');int r=len[lst]-len[fa[lst]];if (l<=r){PR t=query(1,0,n-1,l-1,r-1);if (t.fi==s[i]) ans+=t.se;}}printf("%lld\n",ans);return 0;
}
CF653F. Paper task相关推荐
- 面试相关材料--开放性问题回答和行为事件访谈型面试问题回答示例
最近查找资料,发现了以前为面试准备的材料,特和大家分享如下,希望对你有所帮助. 开放性问题回答示例 要按照"多层Key Words陈述法"回答. 实例:你是怎样取得别人的信任的? ...
- CVPR 2011 全部论文标题和摘要
CVPR 2011 Tian, Yuandong; Narasimhan, Srinivasa G.; , ■Rectification and 3D reconstruction of curved ...
- #Paper Reading#Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts
论文题目: Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts 论文地址: ht ...
- 网友们票选的2018 Best Paper,你pick谁?
整理 | 琥珀 出品 | AI科技大本营 不久前,Reddit 机器学习论坛上一位网友发布了一个帖子: "What is the best ML paper you read in 2018 ...
- [paper] multi-human parsing (MHP) (Zhao et al., 2018) dataset.
Towards Real World Human Parsing: Multiple-Human Parsing in the Wild Paper: https://arxiv.org/pdf/17 ...
- Multi task learning多任务学习背景简介
2020-06-16 23:22:33 本篇文章将介绍在机器学习中效果比较好的一种模式,多任务学习(Multi task Learning,MTL).已经有一篇机器之心翻译的很好的博文介绍多任务学习了 ...
- 今日 Paper | 多人姿势估计;对话框语义分析;无监督语义分析;自然语言处理工具包等
导语:为了更好地服务广大 AI 青年,AI 研习社正式推出全新「论文」版块 目录 基于层次表示的面向任务对话框语义分析 固定的无监督语义分析 斯坦福CoreNLP自然语言处理工具包 DeepCut ...
- 今日 Paper | 虚拟试穿网络;人群计数基准;联邦元学习;目标检测等
2020-01-15 05:41:40 为了帮助各位学术青年更好地学习前沿研究成果和技术,AI科技评论联合Paper 研习社(paper.yanxishe.com),推出[今日 Paper]栏目, 每 ...
- Paper Reading: Papers in Frontiers of NLP 2018 collection
1.Papers collections Note: the original name of the paper will be appended soonly! Index Paper Year ...
最新文章
- 为何Java中子类重写方法的访问权限不能低于父类中权限
- 【51Nod - 1010 】只包含因子2 3 5的数 (打表,有坑越界)
- POI API 创建Excel 文档
- python多版本共存失败记录
- Pytorch模型参数的访问、初始化和共享
- tor浏览器匿名上网_如何使用Tor匿名浏览
- 中国新能源汽车电机及控制器行业需求态势与十四五方向分析报告2021年版
- 网页中无法直接关注微信公众号怎么办?一键唤起微信关注公众号的解决方案
- Adobe帝国的产品线
- Linux WiFi Deauthenticated Reason Code说明
- 人间还是仙界?聊一聊linux系统的用户空间和内核空间
- Java 实现 YoloV7 人体姿态识别
- 中职计算机对数学知识的要求,中职计算机专业的数学教学研究
- python作业爬取xxx大学排行
- 爱奇艺qsv视频下载后怎么转换为3gp格式
- 红队笔记之go语言远控初探
- android系统的刷机步骤,怎么刷机安卓系统,自己就能刷机的方法,太方便了
- 8500万台安卓手机感染病毒,幕后黑手是一家中国公司
- 利用python和Tushare自动更新A股每日数据
- 基于wpa_supplicant库的WIFI连接功能实现--wpa_cli命令解析
热门文章
- 一组超炫酷的动图,感受那让人窒息的数学之美!
- 程序猿都在关注的6个优质公众号
- 算法有偏见?总比人类识别强吧!
- unity重定向_unity3D游戏开发之动画混合与动画重定向
- 插入始终是1_插入式电磁流量计特点与应用
- c语言哈密顿路径算法,用于检查给定图中是否存在哈密顿循环或路径的C ++程序...
- 网络被屏蔽了怎么办_预埋的网线不够长,怎么办?
- java static new_java静态类new的对象是否能被回收?
- mysql sql 检测磁盘_MySQL 数据库磁盘占用情况查询
- java使用教程——组件及事件处理——窗口(设置窗口的颜色和背景)