首页 > 其他分享 >QOJ 7008 另解

QOJ 7008 另解

时间:2024-06-03 19:54:51浏览次数:31  
标签:le Period len operatorname Cyc 7008 另解 endpos QOJ

文中符号:

  • \(\operatorname{Period}(s)\):字符串 \(s\) 的周期集合。
  • \(\operatorname{Per}(s)\):字符串 \(s\) 的最小周期
  • 循环节:\(x\in \operatorname{Period}(s)\) 且 \(x| \operatorname{len}(S)\)。
  • \(\operatorname{Cyc}(s)\):\(s\) 的最小循环节。
  • \(\operatorname{endpos}(x)\):后缀自动机上结点 \(x\) 的 \(\operatorname{endpos}\) 集合中任意一个元素

若有 \(TP=PT\),则 \(P\) 必定为 \(\operatorname{Cyc}(s)^k\)。

考虑先计算出所有本质不同的子串个数,再减去不合法的方案数。(这里计数 \(TP\),而不是 \(T\))。

所以我们要求所有本质不同的 \(a^k\) 个数,其中 \(k\ge 2\)。

考虑优秀的拆分的做法,我们可以在 \(\mathcal{O}(n\log n)\) 求出所有 \((l, r, k)\),满足:

  • \(k\in \operatorname{Period}(s[l, r])\)
  • 不存在 \(l',r'\),满足 \(l'\le l\le r\le r'\) 且 \(k\in \operatorname{Period}(s[l', r'])\)。(换句话说,这个 \((l, r)\) 是级长的)。

但是这样很难和本质不同子串扯出联系。

SAM 是对付本质不同的利器,SAM 中的一个结点 \(u\) 对应着 \(l\in [\operatorname{endpos}(u)-\operatorname{len}((u)+1,\operatorname{endpos}(u)-\operatorname{len}(\operatorname{link}(u))], r=\operatorname{endpos}(u)\) 这些子串。

猜想 I:每个节点中所代表的所有字串上,若 \(\operatorname{Cyc}\) 存在,则 \(\operatorname{Cyc}\) 唯一。

结论:猜想 I 是错误的。反例:\(s=\texttt{baababaabab}\)。存在一个节点 \(u\) 包含 \({\texttt{abaaba,babaaba,ababaaba,aababaaba,baababaaba}}\),周期为 \(3, 5\)。

猜想 II:每个节点中所代表的所有字串上,至多有两个不同的 \(\operatorname{Cyc}\),若存在两个,则一个为最大,一个为最小。(这个最大和最小可能不是很清楚,可以查看下面的步骤)。

结论:我们暂时不知道猜想 II 是否正确。(本机对拍没有找到反例)若猜想 II 被证伪,还有比较弱的猜想 III(同样,未被证明!)。

猜想 III:每个节点中所代表的所有字串上,至多有 \(\log n\) 个不同的 \(\operatorname{Cyc}\)。

不过先别急。在处理出所有三元组 \((l, r, k)\) 后,将所有 \(i\in [l + 2k - 1, r]\) 打上标记 \((l, k)\),表示 \(k\in \operatorname{Period}(s[l,i])\)。

将 SAM 的节点 \(u\) 挂到 \(\operatorname{endpos}(u)\) 下处理,扫描线维护所有标记。

当扫到 \(\operatorname{endpos}(u)=i\) 的时候做以下操作:

  • 取出最小的 \(k\) 满足 \((l, k)\) 中的 \(l\le i-\operatorname{len}(\operatorname{link}(u))\)

  • 计算 \(L\in [\max(l,i-\operatorname{len}(u)+1)],R=i\) 的字串有多少长度是 \(k\) 的倍数。

  • 取出最大的 \(K\) 满足 \((L, K)\) 中的 \(l\le i-\operatorname{len}(\operatorname{link}(u))\)。

  • 若 \(K\) 不为 \(k\) 的倍数,像第二步一样统计 \(K\) 的贡献。

实现

标签:le,Period,len,operatorname,Cyc,7008,另解,endpos,QOJ
From: https://www.cnblogs.com/fjy666/p/-/solution-QOJ7008

相关文章

  • QOJ 4824 Bracket-and-bar Sequences
    考虑到这个实际上没有特别好的表示方法。不如从\(n\le25\),猜想合法的序列数量不多。考虑对这个计数。类似于合法括号序计数,考虑把串拆为\(\texttt{(}\cdots\texttt{|}\cdots\texttt{)}\cdots\)来考虑。那么令\(f_i\)表示\(i\)对\(\texttt{(|)}\)组成的序列的数量。......
  • QOJ 6537 One, Two, Three
    令原题中的\(1,2,3\)分别对应\(0,1,2\)。一种贪心想法就是直接记录\(0,2,01,21,012/210\)的个数然后直接配对。但是考虑到如果当前的\(1\)前面既有\(0\)也有\(2\),后面不管是\(0\)还是\(2\)都能配对。但是按照先前的策略肯定会成为\(01\)或\(21\),这......
  • qoj1138 Counting Mushrooms
    交互题。有一个隐藏的01序列\(a\),你只知道\(a\)的长度,并记为\(n\)。保证\(a_1=0\)。你可以执行以下操作:询问一个序列\(b\),满足两两不同且长度在\([2,1000]\)之间。交互库会返回\(\sum[a(b_i)\not=a(b_{i+1})]\)。请在\(226\)次操作内求出\(a\)中\(0\)......
  • qoj3082 Ascending Matrix 题解
    题目链接点击打开链接题目解法不考虑第\(a_{r,c}=v\)的限制怎么求?我们把条件形式化一下,发现\(k\)个区域的颜色可以表示成轮廓线的形式,即第\(i-1\)条到第\(i\)条轮廓线之间的格点颜色为\(i\)问题变成找到\(k-1\)条互不穿过的路径,起点为\((1,m)\),终点为\((n,1)\)......
  • QOJ5717
    非常好题目,拜谢Itst。不过如果我去考这场估计就哈哈了。\(k=3\)都能卡。还是要避免一条路走到黑啊。懂得变通。\(k=1\)是送的。\(k=2\)较为平凡,只需要将相对大的、相对小的各放一起。\(k=3\)不简单了。首先二分答案\(mid\),经过800万年转换视角,钦定顺序之类的尝试应......
  • QOJ2559
    区间维护类的小(?)DS题。感觉我不怎么会。题意目的明确,就是要动态维护每个区间能覆盖的范围。看一看,感觉题目里的条件很神秘,不知道怎么用。不过可以根据特殊性质推出一个性质:存在包含关系一定先选内部。一开始的思路是用区间互相影响计算,但这个非常复杂,且非常假。在写暴力的时候......
  • QOJ #1280.Fibonacci Partition/Fibonacci性质大杂烩
    QOJ#1280.FibonacciPartition(为什么布置的作业题没有任何可见AC记录啊/kk)拿下了QOJ上的用户首杀(同时目前也是QOJ可见的submission中唯一一个过掉这个题的,另一个是vjudge上我的提交)。也许是这个题实在是太冷门了,但是从Fibonacci-Lucas数列的性质应用上是一道非常......
  • QOJ杂题合集
    QOJ杂题合集QOJ#151.NiceLinesQOJ#838.HorribleCyclesQOJ#894.LongestLooseSegmentQOJ#895.Color给定一个有\(n\)个节点的无向完全图\(G\),每条边都被染成了\(m\)种颜色中的一种,颜色编号为\(1\simm\)。我们称一个无向完全图合法,当且仅当对于\(\forallx......
  • QOJ7899 Say Hello to the future
    QOJ7899SayHellotothefuture考虑先不管修改怎么做。考虑DP,\(f_i\)表示前缀的答案,然后cdq分治优化转移。考虑\(a_i\)最大值所在位置,若在右侧那么\(f_i\)可以被左侧的一个区间转移到,否则左侧的\(f_j\)可以转移到右侧的一个区间,两者都可以线性做。然后考虑问询。我们......
  • QOJ 8171 - Cola
    我们假设目前B知道排列\(p\)的前\(x\)位是多少,那么下一次,B的最优策略是:对于\(i\lex\)的部分,令\(q_i=p_i\)。对于\(i=x+1\)的部分,令\(q_i\)为任一\(p_i\)可能取到但没有被猜过的值。对于\(i>x+1\),随机乱排剩余的\(q_i\)。考虑设\(c_i\)表示第\(i\)次......