首页 > 其他分享 >Significant Suffixes

Significant Suffixes

时间:2024-10-23 19:48:22浏览次数:1  
标签:ssuf log 后缀 text 前缀 Significant mathcal Suffixes

\(\text{Significant Suffixes}\)

我们定义 \(\text{ssuf}(S)\) 表示 \(S\) 中可能成为最小后缀的后缀,形式化定义为

  • 记 \(\text{suf}(S)\) 表示 \(S\) 的所有后缀;
  • 记 \(\text{minsuf}(S)\) 表示 \(S\) 的最小后缀;
  • 定义 \(\text{ssuf}(S)\) 为 \(\{x|x\in \text{suf}(S),\exists T,ST\in \text{minsuf}(ST)\}\);

下面给出 \(\text{ssuf}\) 的两个性质

\(\mathbf{Lemma}\;1\)

对于 \(U,V\in \text{ssuf}(S)\) 且 \(|U|<|V|\) 有 \(U\) 是 \(V\) 的 \(\text{border}\),证明如下:

由于 \(U,V\) 都是 \(S\) 的后缀,所以必定存在包含关系,所以 \(U\) 是 \(V\) 的后缀。

如果 \(U\) 不是 \(V\) 的前缀,无论向串后面加怎样的 \(T\),那么 \(UT\) 与 \(VT\) 的大小关系由 \(U\) 和 \(V\) 决定,所以 \(U,V\) 只有一者有可能是属于 \(\text{ssuf}(S)\),矛盾,所以 \(U\) 是 \(V\) 的前缀。

所以 \(U\) 一定是 \(V\) 的 \(\text{border}\).

\(\mathbf{Lemma}\;2\)

对于 \(U,V\in \text{ssuf}(S)\) 且 \(|U|<|V|\) 有 \(2|U|<|V|\),证明如下:

考虑反证 \(|U|<|V|\le 2|U|\),由 \(\text{Lemma}\;1\) 可知 \(U\) 是 \(V\) 的 \(\text{border}\),所以有 \(|V|-|U|\) 的周期 \(T\),则有 \(U=TC,V=TTC\).

向串后面加入任何字符串 \(R\),那么若 \(UR=TCR<VR=TTCR\) 则 \(CR<TCR\rightarrow CR<UR\),注意到 \(C\) 也是后缀,所以 \(U\) 必定不可能为最小后缀,而若是 \(UR>VR\) 而 \(U\) 也不可能为最小后缀,矛盾,所以 \(2|U|<|V|\).

根据 \(\mathbf{Lemma}\;2\),有 \(|\text{ssuf(S)}|=\mathcal O(\log |S|)\).

\(\text{「ZJOI2017」字符串}\)

考虑用线段树合并维护 \(\text{ssuf}\) 的集合,合并 \(|S_1|,|S_2|\) 的 \(\text{ssuf}\) 时由于 \(|S_2|\le |S_1|\le |S_2|+1\) 所以 \(\text{ssuf}(S_1)\) 中至多有 \(1\) 个属于 \(\text{ssuf}(S_1S_2)\).

考虑如何选出那个元素,设 \(U,V\in \text{ssuf}(S_1)\) 不妨设 \(US_2<VS_2\),如果 \(US_2\) 不是 \(VS_2\) 的 \(\text{border}\),那么 \(VS_2\) 可以排除,否则 \(US_2\) 可以排除,设最后留存的为 \(P\),直接使 \(\text{ssuf}(S_1S_2)=\text{ssuf}(S_2)\cup\{P\}\),能够保证复杂度,但是常数较大,考虑挑出 \(S_2\) 中不合理的.

然后考虑 \(V\in \text{ssuf}(S_2)\),那么

  • 若 \(V\) 是 \(P\) 的前缀,不做任何操作;
  • 若 \(V\) 不是 \(P\) 的前缀,且 \(V<P\),抛弃 \(P\);
  • 若 \(V\) 不是 \(P\) 的前缀,且 \(V>P\),抛弃 \(V\);

这样可以有效减小常数。

查询时,我们将 \(\mathcal{O}(\log^2n)\) 的集合全部检查一遍,检查和合并时我们需要比较两个字符串的大小,修改时由于影响到 \(\mathcal{O}(\log n)\) 个线段树节点,而且被修改区间完整覆盖的 \(\text{ssuf(S)}\) 不发生变化,所以总共需要 \(\mathcal{O}(n\log n+m\log^2 n)\) 次比较,考虑使用数据结构维护 \(\text{Hash}\) 二分实现,这样需要 \(\mathcal{O}(n\log^2 n+m\log^3 n)\) 次查询和 \(\mathcal O(m)\) 次修改,由于查询和修改不平衡,可以使用 \(\mathcal O(sqrt(n))\) 修改和 \(\mathcal O(1)\) 查询的分块维护。总复杂度为 \(\mathcal O(n\log^2 n+m\log^3 n+m\sqrt n)\).

标签:ssuf,log,后缀,text,前缀,Significant,mathcal,Suffixes
From: https://www.cnblogs.com/JIEGEHHHH/p/18498231

相关文章

  • Prefix of Suffixes
    为什么求Z函数的过程又被称为【扩展KMP】呢?因为KMP算法是可以求出哪些后缀能与前缀完全匹配的,而Z函数则对于那些不能完全匹配的后缀,求出了最大的匹配长度现在你已经将问题转化为:在未被标记的后缀中,快速锁定当前新增的字符会使得哪些后缀失配“未被标记”太抽象了,回溯这个条件—......
  • most & least significant bit
    英语是程序员的核心竞争力介绍字节序的wiki中看到一个“mostsignificantbit”的概念,点进去一看还是有点小意思的:原文这里的most/leastsignificantbit从字面上翻译是:最重要的/最不重要的bit。但这个翻译一下子可能不太容易理解:为什么bit还有重要不重要之分?大家日常......
  • Prefixes and Suffixes (CF D) (字符串翻转找性质)
     思路:利用操作使得题目更好分析,t的后缀,反转t,来看t的前缀, 实际操作的时候,把s和t的前缀在反转一下进行交换就可以了,发现性质1C(si,ti)他们的相对位置不会变化,一直是匹配的然后利用翻转的性质,一定会产生任意我想要的排列 (从后开始构造,先把目......
  • [CF1730D] Prefixes and Suffixes 题解
    首先发现后缀和前缀比较不好看,所以翻转第二个字符串,记为\(T'\)。这样就变成了操作两个字符串的前缀。观察发现,操作\(k\)等价于交换\(S[1\simk]\)和\(T'[1\simk]\),然后翻转\(S[1\simk]\)和\(T'[1\simk]\)。结论1:同一个下标上的字符对恒定。因为我们所有的操作都......
  • Prefixes and Suffixes 题解
    题目传送门一道字符串题。我们考虑还原字符串后再一个一个的判断。很显然,这个字符串是由一个长度为\(n-1\)的前缀和后缀组成的。因此我们可以找到这\(2\)个长度为\(n\)的字符串,然后枚举哪个是前缀,哪个是后缀。值得注意的是,当你判断一个字符串为前缀时,如果后面出现了同样......
  • codeforces 368B B. Sereja and Suffixes(树状数组)
    题目链接:codeforces368B题目大意:给出一个长度为n的序列a,给出m个查询l,对于每个查询输出[l,n]的区间内不同数的个数。题目分析:将查询按照l的大小排序,从大到小的遍历,每次将>=当前l的位置的a[i]全部加入树状数组,树状数组记录每个数是否出现过。每次结果就是查询树状数组的总和,要保证......
  • D. Prefixes and Suffixes
    题意给定两个长度为\(n\)的字符串,\(k\in[1,n]\),你可以把其中一个字符串长度为\(k\)的前缀与另一个字符串长度为\(k\)的后缀交换,问能不能通过若干次操作,使两个字符串完全......