ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Gym102803E Everybody Lost Somebody / 4.6 校内考试 Dark Blue(hush)

2022-04-06 23:01:36  阅读:239  来源: 互联网

标签:Everybody Blue 4.6 后缀 ht 这个 做法 sa rk


对于一个串 \(s\),给出 \(s\) 串的 \(\{sa_i\}, \{ht_i\}\)(height),其中部分 \(ht_i\) 可能不知道,用 \(-1\) 表示。求这个串。如有多解,输出字典序最小的。保证存在解。
\(n \le 5000\),考试版本 \(n \le 10^6\)。


  字符串 并查集 后缀数组 拓扑排序

做法 1

  这个部分的前半段继承于考场做法。

  考虑 \(ht_i \neq -1\) 的情况,可以直接将所有相同的缩到一起,然后不同的连一条 \(1\) 的边,然后对于缩完的块拓扑排序,求出字典序最小的解。

  这个缩到一起的过程,我们发现我们求 \(ht\) 的时候有一个比较代码,这个代码会告诉我们那些字符串是相等的,然后模拟就完事了。

  对于 \(ht_i = -1\) 的情况,我们发现接下来的问题有点困难了,但是我们观察 \(sa_i\) 和 \(sa_{i - 1}\),如果我们忽略 \(sa_i\) 这个字符,考虑 \(sa_i + 1\) 这个后缀,忽略 \(sa_{i - 1}\) 这个字符,考虑 \(sa_{i - 1}+1\) 这个后缀,这两个后缀的大小关系是知道的,然后就可以讨论以下:

  • 如果 \(rk_{sa_i + 1} < rk_{sa_{i - 1}+1}\),那么 \(s[sa_{i - 1}] < s[sa_i]\)。
  • 否则,\(s[sa_{i - 1}] \le s[sa_i]\)。

  两种分别连上 \(0\) 的边和 \(1\) 的边,然后拓扑排序即可。

  但是拓扑排序可能会出现一个 \(0\) 环,于是可以按照后缀大小的顺序计算答案。

  代码

做法 2

  虽然上面的做法可以直接通过校内考试出题人的数据,但是直接在 CF 上面被卡了。

  因为 CF 是 \(5000\) 的范围,可以直接暴力合并。

  进一步可以发现,只要在合并的时候保持后缀大小顺序的连边,就可以通过了。

  也就是:

void merge(int x, int y) { x = gf(x), y = gf(y); if(rk[x] < rk[y]) swap(x, y); if(x != y) fa[x] = y; }

  代码。如果这个做法成立,可以通过倍增优化并查集进一步达到 \(\mathcal O(n \log n \alpha)\)。

做法 3

  不幸的是,我擅长制造假做法,同时上面的不够优美而且不够正确。

  通过对拍,可以直接卡掉:

20
20 9 17 10 4 12 19 8 7 1 3 18 2 16 11 6 15 5 14 13 
1 1 -1 -1 2 -1 -1 1 -1 -1 1 -1 -1 2 -1 -1 2 -1 -1 

  这个会输出:

bccaddbbaadadeddacba

  正确答案应该是:

bccaedbbaadaeeedacba

  这个被叉实际上是对于信息利用不完全,有些点关系没有合并到,而正确的应该是对于 \(s[sa_i + j] = s[sa_{i - 1}+j]\) 这个条件,\([rk_{sa_{i+j}}, rk_{sa_{i - 1}+j}]\) 这段区间的字符都是相等的,之前的做法只合并了左右端点,因此有问题。

  于是每次都是合并 \(rk\) 上面的一段,使用并查集即可。

  代码

  一次制造一堆假做法也没谁了

标签:Everybody,Blue,4.6,后缀,ht,这个,做法,sa,rk
来源: https://www.cnblogs.com/werner-yin/p/16110060.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有