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相关推荐

  1. 面试相关材料--开放性问题回答和行为事件访谈型面试问题回答示例

    最近查找资料,发现了以前为面试准备的材料,特和大家分享如下,希望对你有所帮助. 开放性问题回答示例 要按照"多层Key Words陈述法"回答. 实例:你是怎样取得别人的信任的? ...

  2. CVPR 2011 全部论文标题和摘要

    CVPR 2011 Tian, Yuandong; Narasimhan, Srinivasa G.; , ■Rectification and 3D reconstruction of curved ...

  3. #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 ...

  4. 网友们票选的2018 Best Paper,你pick谁?

    整理 | 琥珀 出品 | AI科技大本营 不久前,Reddit 机器学习论坛上一位网友发布了一个帖子: "What is the best ML paper you read in 2018 ...

  5. [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 ...

  6. Multi task learning多任务学习背景简介

    2020-06-16 23:22:33 本篇文章将介绍在机器学习中效果比较好的一种模式,多任务学习(Multi task Learning,MTL).已经有一篇机器之心翻译的很好的博文介绍多任务学习了 ...

  7. 今日 Paper | 多人姿势估计;对话框语义分析;无监督语义分析;自然语言处理工具包等

    导语:为了更好地服务广大 AI 青年,AI 研习社正式推出全新「论文」版块   目录 基于层次表示的面向任务对话框语义分析 固定的无监督语义分析 斯坦福CoreNLP自然语言处理工具包 DeepCut ...

  8. 今日 Paper | 虚拟试穿网络;人群计数基准;联邦元学习;目标检测等

    2020-01-15 05:41:40 为了帮助各位学术青年更好地学习前沿研究成果和技术,AI科技评论联合Paper 研习社(paper.yanxishe.com),推出[今日 Paper]栏目, 每 ...

  9. 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 ...

最新文章

  1. 为何Java中子类重写方法的访问权限不能低于父类中权限
  2. 【51Nod - 1010 】只包含因子2 3 5的数 (打表,有坑越界)
  3. POI API 创建Excel 文档
  4. python多版本共存失败记录
  5. Pytorch模型参数的访问、初始化和共享
  6. tor浏览器匿名上网_如何使用Tor匿名浏览
  7. 中国新能源汽车电机及控制器行业需求态势与十四五方向分析报告2021年版
  8. 网页中无法直接关注微信公众号怎么办?一键唤起微信关注公众号的解决方案
  9. Adobe帝国的产品线
  10. Linux WiFi Deauthenticated Reason Code说明
  11. 人间还是仙界?聊一聊linux系统的用户空间和内核空间
  12. Java 实现 YoloV7 人体姿态识别
  13. 中职计算机对数学知识的要求,中职计算机专业的数学教学研究
  14. python作业爬取xxx大学排行
  15. 爱奇艺qsv视频下载后怎么转换为3gp格式
  16. 红队笔记之go语言远控初探
  17. android系统的刷机步骤,怎么刷机安卓系统,自己就能刷机的方法,太方便了
  18. 8500万台安卓手机感染病毒,幕后黑手是一家中国公司
  19. 利用python和Tushare自动更新A股每日数据
  20. 基于wpa_supplicant库的WIFI连接功能实现--wpa_cli命令解析

热门文章

  1. 一组超炫酷的动图,感受那让人窒息的数学之美!
  2. 程序猿都在关注的6个优质公众号
  3. 算法有偏见?总比人类识别强吧!
  4. unity重定向_unity3D游戏开发之动画混合与动画重定向
  5. 插入始终是1_插入式电磁流量计特点与应用
  6. c语言哈密顿路径算法,用于检查给定图中是否存在哈密顿循环或路径的C ++程序...
  7. 网络被屏蔽了怎么办_预埋的网线不够长,怎么办?
  8. java static new_java静态类new的对象是否能被回收?
  9. mysql sql 检测磁盘_MySQL 数据库磁盘占用情况查询
  10. java使用教程——组件及事件处理——窗口(设置窗口的颜色和背景)