首页 > 其他分享 >题解 CF653F Paper task

题解 CF653F Paper task

时间:2024-01-18 12:14:32浏览次数:25  
标签:-- 题解 ll back tp Paper maxn vec CF653F

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;
}

标签:--,题解,ll,back,tp,Paper,maxn,vec,CF653F
From: https://www.cnblogs.com/sssooommm/p/17972181

相关文章

  • 【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(下)
    承接上文在阅读了上篇文章《【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)》之后,相信您对HashMap的基本原理和基础结构已经有了初步的认识。接下来,我们将进一步深入探索HashMap的源码,揭示其深层次的技术细节。通过这次解析,您将更深入地理解HashMap的......
  • chrome浏览器闪屏问题解决
    描述:我在浏览B站时,在打字时突然出现了闪屏,反应很强烈!一输入就出现!我还一直以为是电脑显卡出了问题!后来查询资料发现这是谷歌很久以前的一个bug,至今都没有修复!至少在我发帖之前一直是没有解决的!开启硬件加速若想使用硬件加速,可以在网址栏输入:chrome://flags/选择ChooseANGL......
  • CF1633B题解
    Minority题面翻译给定一个\(01\)字符串\(s\),定义\(c_k(l,r)\)表示\(s\)的由下标为\([l,r]\)中的字母构成的连续子串中\(k\)的个数。定义\(f(l,r)=\begin{cases}c_0(l,r)&c_0(l,r)<c_1(l,r)\\c_1(l,r)&c_0(l,r)>c_1(l,r)\\0&c_0(l,r)=c_1(l,r)\end{cases}\),求......
  • P3391 文艺平衡树 题解
    QuestionP3391文艺平衡树写一种数据结构维护有序数列,需要完成以下操作:翻转一个区间,例如原有的序列是\(5,3,3,2,1\),翻转区间是\([2,4]\)的话,结果是\(5,2,3,4,1\)Solution这道题的表达是\(Splay\)但是\(Splay\)的代码实现比较困难,考虑使用FHQTreap。先思考如何将一......
  • CF1633A题解
    Div.7题面翻译给定\(t\)组数据。每组数据给定一个数\(n\)(\(10\len\le999\))。每次操作可以修改\(n\)任意一位上的数,将这一位上的数修改为\(0\sim9\)之间的任意数。要求使用最少的修改次数使这个数修改后是\(7\)的倍数,并且没有多余的前导\(0\)。输出修改后的数,如......
  • CF1637A题解
    SortingParts题面翻译给定一个长度为n的数组a。你可以执行恰好一次操作。每次操作选择一个在[1,n-1]内的整数len,然后将数组a中长度为len的前缀和长度为n-len的后缀分别排序。请判断是否能够通过操作,使得最终的数组a不满足\foralli\in[1,n),a_i<=a(i+1)。数据范......
  • [ARC169E] Avoid Boring Matches 题解
    题目链接首先考虑无解的情况,一个显然的观察是如果R的个数大于一半,那么无论如何都会出现两个R比赛的情况,小于一半时我们可以调整使得B全都在前面,显然有解。接下来问题变为找到最优可行解,但是状态的合法性不是显然的,我们先尝试判定这个问题。先考虑第一轮比赛,显然我们想让......
  • SP839Optimal Marks 题解
    part1:建图二进制异或,每一位互不干扰。所以对每一位分开来考虑。然后变成了一个经典的模型。当前每一个未确定点有两个选择:变成\(1\),变成\(0\);已经确定的点只能选它本身的值。于是构造思路非常套路了:构造虚点\(S\)、\(T\)。对于一个点\(u\),从\(S\)连向\(u\)一条边,值为......
  • ABC311_g One More Grid Task 题解
    题目链接:Atcoder或者洛谷对于解决二维区间内的最值类型问题,我们常常有一类特别好用的方法,就是悬线法,它可以看做是单调栈的子集,但更加好理解和书写。对于悬线法,我们有一个常见的模型,找出面积最大的符合题意的最大的矩形:例题P4147玉蟾宫。对于悬线法而言,我们需要理解什么是悬......
  • P2216 [HAOI2007] 理想的正方形 题解
    题目链接:理想的正方形比较明显的,我们可以用二维ST表解决,具体的二维ST表的实现,只需要知道一点:对于\(st[i][j][t]=max(i\simi+2^t,j\simj+2^t)\),表示的是如图所示的大正方形范围内的最值,它可以拆成从四个小正方形的左端点走\(2^{t-1}\)长的小正方形组成,预处理完直接查......