CF653F Paper task

给定一个长度为 \(n\) 和括号串,求本质不同的合法括号串个数。\(n\le 5\times 10^5\)。

考虑如果不是求本质不同,可以想到 DP。

设 \(f_{i}\) 表示以 \(i\) 结尾的括号串数,容易发现 \(f_{i}=f_{t_{i}-1}+1\),其中 \(t_{i}\) 表示与 \(i\) 匹配的左括号位置。用栈模拟即可做到 \(O(n)\)。我们考虑把这个转移的边建出来,然后发现这是一个森林的结构。

再考虑去重,利用 SA,对于每个数的 \(f_{i}\),我们只取长度严格大于 \(height_{i}\) 的串,这对于森林中就是到根到该点路径的一段前缀,倍增优化跳的过程即可做到 \(O(n\log n)\)。

#include<bits/stdc++.h>
using namespace std; typedef long long ll; const ll maxn=5e5+5;
char s[maxn]; ll n, m=100;
ll num[maxn], rk[maxn], sa[maxn], tp[maxn], height[maxn], g[maxn]; void basesort(){
memset(num,0,sizeof(num));
for(ll i=1;i<=n;i++) num[rk[i]]++;
for(ll i=1;i<=m;i++) num[i]+= num[i-1];
for(ll i=n;i>=1;i--) sa[num[rk[tp[i]]]--]=tp[i];
return ;
} void SuffixSort() {
m=100s;
for(ll i=1;i<=n;i++) rk[i]=s[i]-'('+1,tp[i]=i;
basesort();
for(ll w=1,p=0;p<n;m=p,w<<=1) {
p=0;
for(ll i=1;i<=w;i++) tp[++p]=n-w+i;
for(ll i=1;i<=n;i++) if(sa[i]>w) tp[++p]=sa[i]-w;
basesort();
for(ll i=1;i<=n;++i) swap(tp[i],rk[i]);
rk[sa[1]]=1;
p=1;
for(ll i=2;i<=n;i++) {
if(tp[sa[i-1]]==tp[sa[i]]&&tp[sa[i-1]+w]==tp[sa[i]+w]) rk[sa[i]]=p;
else rk[sa[i]]=++p;
}
}
return ;
} ll f[maxn][20]; int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin>>n;
for(ll i=1;i<=n;i++) cin>>s[i];
for(ll i=1;i<=n+1;i++) {
for(ll j=0;j<20;j++) f[i][j]=n+1;
}
vector<ll> vec;
for(ll i=n;i>=1;i--) {
if(s[i]==')') vec.push_back(i);
else {
if(vec.size()&&s[vec.back()]==')') {
f[i][0]=vec.back()+1;
g[i]=g[vec.back()+1]+1;
for(ll j=1;j<20;j++) f[i][j]=f[f[i][j-1]][j-1];
vec.pop_back();
}else vec.push_back(i);
}
}
SuffixSort();
ll k=0;
for(ll i=1;i<=n;i++) {
if(k) --k;
ll j=sa[rk[i]-1];
while(i+k<=n&&s[i+k]==s[j+k]) ++k;
height[rk[i]]=k;
}
ll ans=0;
for(ll i=1;i<=n;i++) {
ll x=sa[i];
for(ll j=19;j>=0;j--) if(f[x][j]-sa[i]<=height[i]) x=f[x][j];
ans+=g[x];
}
cout<<ans<<'\n';
return 0;
}

题解 CF653F Paper task的更多相关文章

  1. [CF653F] Paper task - 后缀数组,线段树,vector

    [CF653F] Paper task Description 给定一个括号序列,统计合法的本质不同子串的个数. Solution 很容易想到,只要在传统统计本质不同子串的基础上修改一下即可. 考虑经 ...

  2. CF653F Paper task

    题目链接:洛谷 首先我们不考虑本质不同这个限制. 既然不能直接用栈乱搞,我们就可以用一个前缀和的套路了. 我们将(设为1,将)设为-1,记前缀和为$s_i$,则$[i,j]$这一段是回文子串当且仅当 ...

  3. Codeforces 653F Paper task SA

    Paper task 如果不要求本质不同直接st表二分找出最右端, 然后计数就好了. 要求本质不同, 先求个sa, 然后用lcp求本质不同就好啦. #include<bits/stdc++.h& ...

  4. 题解-Sakuya's task

    题面 Sakuya's task \[\left(\sum_{i=1}^n\sum_{j=1}^n \varphi(\gcd(i,j))\right)\bmod 10^9+7 \] 数据范围:\(1\ ...

  5. CF IndiaHacks 2016 F Paper task 后缀数组

    题目链接:http://codeforces.com/problemset/problem/653/F 大意是给出一个只包含'('和')'的括号串,求有多少不同的子串是合法的括号串 解法:对于每一个后 ...

  6. 3.26-3.31【cf补题+其他】

      计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...

  7. HDU-3974 Assign the task题解报告【dfs序+线段树】

    There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...

  8. 【题解】 CF11D A Simple Task

    [题解] CF11D A Simple Task 传送门 \(n \le 20\) 考虑状态压缩\(dp\). 考虑状态,\(dp(i,j,O)\)表示从\(i\)到\(j\)经过点集\(O\)的路径 ...

  9. Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基 (看题解)

    Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #inclu ...

  10. [CF11D]A Simple Task 题解

    题解 我们从最简单的思路开始考虑,首先看到题目发现\(n\)非常小,于是很容易想到状态压缩. 我们考虑比较直觉的状态,f[i][j][k]表示以i为起点,当前在j,之前去过的点状态为k的简单环的方案数 ...

随机推荐

  1. 申请并部署免费的 SSL/TLS 证书

    对于囊中羞涩的我们来说,只要能白嫖,就绝不乱花钱.惯常申请免费 SSL/TLS 证书的途径有: 各大云服务平台限量提供.比如阿里云会给每个账号每年 20 个证书的申请额度.缺点是不支持泛域名,一年后须 ...

  2. 鸿蒙HarmonyOS实战-Web组件(Cookie及数据存储)

    前言 Cookie是一种存储在用户计算机上的小文本文件,用于在用户访问网站时存储和提取信息.它由网站服务器发送到用户的浏览器,并存储在用户的计算机上.每当用户访问该网站时,浏览器将发送该Cookie回 ...

  3. LeetCode 40. Combination Sum II 组合总和 II (C++/Java)

    题目: Given a collection of candidate numbers (candidates) and a target number (target), find all uniq ...

  4. 剑指Offer-56.删除链表中重复的结点(C++/Java)

    题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 ...

  5. ETL工具-nifi干货系列 第一讲 揭开nifi神秘面纱

    1.nifi简介 Apache NiFi 是基于流程编程概念的数据流系统.它支持强大且可扩展的数据路由.转换和系统中介逻辑的有向图.NiFi具有基于Web的用户界面,用于设计.控制.反馈和监控数据流. ...

  6. window10设置保护眼睛的颜色

    1.调出运行菜单.右击开始键选择运行,或者同时按下键盘上的WIN+R打开运行框,输入 regedit 回车转到注册表编辑器.2.选择第二项 HKEY_CURRENT_USER 点击进入.进入后点击 C ...

  7. WebApi 接口参数不再困惑

    从网上看了WEBAPI理解感觉不错分享一下 前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法 ...

  8. AWX+gitlab

    目录 AWX+gitlab 1. Awx配置 1.1 添加机构 1.2 添加团队 1.3 添加主机 1.4 测试主机连通性 2. 对接gitlab 2.1 添加凭证 2.2 添加项目 2.3 上传pl ...

  9. Stable Diffusion 生成个性图片指南

    在当今人工智能领域,midjourney无疑是生成图片的王者,但是苦于付费才能使用,今天我就给大家分享一下midjourney平替stable diffusion,实现本地生成不逊色于midjourn ...

  10. nginx 反向代理(proxy)与负载均衡(upstream)应用实践

    集群介绍 集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器.这些服务器之间可以彼此通信,协同向 ...