【题解】P4218 [CTSC2010]珠宝商

这种题出出来有什么必要吗,太难写了吧。

题意

给定一棵树和一个文本串 T,每个结点上有一个字符,问树上任意路径构成的字符串在 T 中的出现次数之和。

n,m5×104

思路

点分治 + 后缀自动机 + 根号分治。

首先可以发现期望是假的。

然后考虑点分治做树上路径计数。这里对于当前的分治重心 u,统计经过 u 的所有路径构成的字符串在 S 中的出现次数之和。

看到子串出现次数之和考虑用 SAM 做。

听起来很复杂对不对?暴力怎么做?搜索!搜索!搜索!

考虑把一条经过点 u 的树上路径 pq 分成 puuq 两部分,后面那一部分可以在子树里面直接搜,暴力在 parent tree 上跳。

第一部分是在反串上做的镜像问题,因为要在整串的前方加入一个字符,所以需要在 parent tree 上先处理出在整串的前方加入字符所导向的子结点,这个很好做。

在 parent tree 上跳到某个结点终止后,显然这个结点所代表的串的任意一个后缀都在 T 中出现过,所以出现次数是所有祖先的出现次数之和,考虑做一个树上前缀和。

考虑统计答案:考虑 T 中每一个位置的贡献,那么答案就是 前缀 [1,i] 的任意后缀在 T 中的出现次数之和 × 后缀 [i+1,m] 的任意前缀在 T 中的出现次数之和。

这里的时间复杂度是 O(size+m),约等于白做。

但是我们还有另一种暴力:枚举子树中的初始结点,然后暴搜接下来的树上路径,复杂度 O(size2)

那直接套一个根号分治就做完了。

代码

posted @   kymru  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩