首页 > 其他分享 >题解:P5184 [COCI2009-2010#2] PASIJANS

题解:P5184 [COCI2009-2010#2] PASIJANS

时间:2024-09-24 16:37:27浏览次数:1  
标签:sort cont wa int 题解 PASIJANS maxn 2010 rk

分析

考虑贪心,每次尽量选最小的字符。

显然是每次选字典序最小的弹栈。

我们要比较的是每个栈的字典序,但是朴素比较是 \(O(L)\) 的,考虑将它优化到 \(O(1)\)。

这个时候我们可以先离散化然后套路地将所有串拼一起跑 SA。

记得在每个串之间加分割符。

这样每次比较字典序就变成了 \(O(1)\)。

时间复杂度 \(O((\sum L)\log (\sum L))\)。

Code

#include<bits/stdc++.h>
using namespace std;
#define maxn 2000006

int sa[maxn], x[maxn], y[maxn], c[maxn];

void radix_sort(int n, int m)
{
    for(int i=1;i<=m;i++) c[i]=0;
    for(int i=1;i<=n;i++) c[x[i]]++;
    for(int i=1;i<=m;i++) c[i]+=c[i-1];
    for(int i=n;i;i--) sa[c[x[y[i]]]--]=y[i];
}

void suffix_sort(int *s, int n)
{
    int m=1e6;
    for(int i=1;i<=n;i++) x[i]=s[i], y[i]=i;
    radix_sort(n, m);
    for(int k=1;k<=n;k<<=1)
    {
        int cnt=0;
        for(int i=n-k+1;i<=n;i++) y[++cnt]=i;
        for(int i=1;i<=n;i++) if(sa[i]>k) y[++cnt]=sa[i]-k;
        radix_sort(n, m);
        swap(x, y);
        x[sa[1]]=cnt=1;
        for(int i=2;i<=n;i++)
            x[sa[i]]=(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k])?cnt:++cnt;
        if((m=cnt)==n) return;
    }
}

int cont[maxn];
vector<int> wa;
int pos[1003], len[1003], stp[1003];
int rk[maxn];
struct cmp{bool operator()(int a, int b) {return rk[pos[a]]>rk[pos[b]];}};
priority_queue<int, vector<int>, cmp> pq;

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        pos[i]=stp[i]=*cont+1;
        cin>>len[i];
        for(int j=1;j<=len[i];j++)
        {
            cin>>cont[++*cont];
            wa.emplace_back(cont[*cont]);
        }
        cont[++*cont]=2e9;
    }
    sort(wa.begin(), wa.end());
    auto end_it=unique(wa.begin(), wa.end());
    for(int i=1;i<=*cont;i++)
        cont[i]=lower_bound(wa.begin(), end_it, cont[i])-wa.begin()+1;
    suffix_sort(cont, *cont);
    for(int i=1;i<=*cont;i++)
        rk[sa[i]]=i;
    for(int i=1;i<=n;i++) pq.emplace(i);
    while(!pq.empty())
    {
        int v=pq.top();
        pq.pop();
        cout<<wa[cont[pos[v]]-1]<<' ';
        pos[v]++;
        if(pos[v]!=stp[v]+len[v]) pq.emplace(v);
    }
}

标签:sort,cont,wa,int,题解,PASIJANS,maxn,2010,rk
From: https://www.cnblogs.com/redacted-area/p/18429469

相关文章

  • 题解:P6351 [PA2011] Hard Choice
    题意维护一张无向图,要求支持以下操作:切断一条边。查询两个点是否有有两条完全不同的路径相连。分析因为断边操作不好维护,考虑离线后将断边变为加边。因此,我们只需要维护加边操作即可。考虑使用LCT。首先,因为涉及到边权,套路地用节点代替边。如果某一条边连接的两个点......
  • ABC245G Foreign Friends 题解 / 二进制分组
    ABC245GForeignFriends题解回顾一下二进制分组。题目大意给定一张\(N\)个点\(M\)条边的无向图,及\(L\)个特殊点。每个点有颜色\(C_i\)。求每个点到离他最近的与他颜色不同特殊点的距离。Solve两个点颜色不同,等价于他们的颜色在二进制下至少有一位不同。所以我们考......
  • MySQL GROUP BY 分区大小写问题解析
    在数据库操作中,GROUPBY是一个常用的SQL语句,用于根据一个或多个列的值对结果集进行分组。然而,在使用MySQL时,你可能会遇到一个常见问题:大小写敏感性。本文将探讨MySQL中GROUPBY的大小写敏感性问题,并提供一些解决方案。什么是大小写敏感性?在计算机科学中,大小写敏感性是指......
  • Codeforces Round 974 (Div.3) 题解
    CodeforcesRound974(Div.3)题解A.RobinHelps模拟按照题意模拟即可。voidShowball(){intn,k;cin>>n>>k;intcur=0,ans=0;for(inti=0;i<n;i++){intx;cin>>x;if(x>=k)cur+=x;elseif(!x){if(cur>=1)cu......
  • AT_jsc2021_g Spanning Tree 题解
    感觉自己稍微有一点唐了。思路我们首先可以把一定要连的边连起来。这样就变成了一个无向图生成树计数问题。如何求解。使用矩阵树定理!我们可以求出基尔霍夫矩阵,然后跑一遍行列式就可以了。时间复杂度:\(O(n^3)\)。Code#include<bits/stdc++.h>usingnamespacestd;con......
  • Count Equation Solutions 题解
    前言题目链接:洛谷;UVA。题意简述求以下方程解的个数:\[a_1x_1-a_2x_2+a_3x_3-a_4x_4+a_5x_5-a_6x_6=0\]其中\(1\leqx_i\leqm\leq10^2\),\(x_i\in\mathbb{Z}\),多测。题目分析把\(a_2,a_4,a_6\)变成其相反数,变成\(\sum\limits_{i=1}^6a......
  • 题解 [ARC184B] 123 Set
    个人认为思维难点相同的三倍经验:P3226[HNOI2012]集合选数、TFSETS-Triple-FreeSets。区别在于状压DP的方法。我们称不包含质因子\(2\)和\(3\)的数为\(2,3\texttt{-Free}\)的。对于\([1,n]\)内每个\(2,3\texttt{-Free}\)的整数\(u\),可以列出以下的矩阵:\[\begi......
  • NEERC2013题解
    B.BonusCards简单dp一下,记\(f_{ij}\)为前i次有j次分给第一类的概率。最后再算上我在第一类被选上的概率即可。constintN=3005;#defineintlonglongintn,a,b;doublef[N][N],g[N][N];signedmain(void){#ifdefONLINE_JUDGE freopen("bonus.in","r",stdin......
  • 题解:CF888G Xor-MST
    题解:CF888GXor-MST题目大意:给定\(n\)个点的点权,任意两点间边权是点权的异或和。求这张完全图的MST的权值。思路:Boruvka+Trie树+按位贪心。关键就在于如何求出Boruvka中的best数组。考虑对点权建trie树,对于节点\(i\)本轮的连边,就是找“和它最相似”的那......
  • SP1825 FTOUR2 - Free tour II 题解
    题目传送门前置知识点分治|树状数组解法维护点对信息,考虑点分治。本题比luoguP4149[IOI2011]Race多了个前缀查询\(\max\)。套个支持单点修改、区间查询\(\max\)的数据结构即可。直接线段树维护区间\(\max\)貌似会TLE,换成树状数组维护前缀\(\max\)即可。注......