当前位置:网站首页>[COCI]Lampice (二分+树分治+字符串哈希)
[COCI]Lampice (二分+树分治+字符串哈希)
2022-04-23 06:21:00 【Zimba_】
题意:
给定一棵 n n n个结点的树,每个结点有一个小写字母 a — z a—z a—z。要求一条最长的简单路径,满足沿路径得到的字符串是回文串。
( 1 ≤ n ≤ 1 0 5 1\leq n \leq10^{5} 1≤n≤105)
思路:
首先要考虑的问题是,用什么方式去判断树上的一条路径是不是回文串。
这里采用的方法是字符串哈希。
举个例子,给 a — z a—z a—z每个字母都自己(我命由我不由天)设置一个哈希值,再设置一个 b a s e base base值和模数 M M M,字符串 a b b c b b a abbcbba abbcbba的哈希值就是 H ( a ) + H ( b ) × b a s e + H ( b ) × b a s e 2 + H ( c ) × b a s e 3 + … + H ( a ) × b a s e 6 ( m o d M ) H(a)+H(b)\times base+H(b)\times base^{2}+H(c)\times base^{3}+…+H(a)\times base^{6} (mod\;M) H(a)+H(b)×base+H(b)×base2+H(c)×base3+…+H(a)×base6(modM)。
那么,处理出前缀哈希值后,可以快速算出子串的哈希值。
判断一个串是不是回文串,我们只要得到从前往后的哈希值和从后往前的哈希值,比较是否相同即可。
那么多次询问某段子串是不是回文串,我们只要预处理出从前往后的哈希值前缀,和从后往前的哈希值后缀。就可以快速算出某段前往后和后往前的哈希值进行比较,来判断是否是回文串。
有了这个工具后,这题我们只要在树上预处理出哈希值,就可以通过计算判断路径是否为回文串。
现在,我们再来思考怎么求最长的回文路径。这个显然满足二分性质。所以,我们二分路径的长度,然后判断是否存在该长度的回文路径。
那么,现在就剩最后一个问题,就是怎么检验是否存在某个长度的回文路径。
我们设根为 R R R,那么路径分两种,一种是经过 R R R的,一种是不经过 R R R的。
假设我们可以 o ( n ) o(n) o(n)算出经过 R R R的情况,对于不经过 R R R的情况,路径都是在它的子树里。于是我们就可以用重心分解,也就是树分治来解决了,只要每次拿重心作为 R R R,总体复杂度就是 o ( n l o g n ) o(nlogn) o(nlogn)。
所以,我们现在最后要解决的问题就是,如何 o ( n ) o(n) o(n)检验是否存在经过树根 R R R,且长度给定的回文路径。
对于某一条经过 R R R的路径,一定是长这样子的。(题解盗图)
判断这条路径是否是回文串,我们只要判断 R R R到 C C C是回文串,并且 C C C到 A A A的串和 R R R到 C C C的串相同。
我们通过枚举把 A A A定下来,这时候 C C C也能算出来,我们判断完 R C RC RC,算出 C A CA CA,就只要看其他子树里,是否存在 R B RB RB的值和 C A CA CA相同。 我们把其他的子树的 R B RB RB值存到 s e t set set里,就可以 o ( l o g n ) o(logn) o(logn)找。
当我们用 u n o r d e r e d _ s e t unordered\_set unordered_set的时候,就变成 o ( 1 ) o(1) o(1)找了。那么复杂度就变成 o ( n ) o(n) o(n)了。
最后,总体复杂度就是 o ( n l o g 2 n ) o(nlog^{2}n) o(nlog2n)了。
代码:
咕一会儿。
版权声明
本文为[Zimba_]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43785386/article/details/108576777
边栏推荐
- 大型体育赛事无线通信系统
- 自定义钉钉机器人进行报警
- 启动mqbroker.cmd失败解决方法
- 按需引入vant组件
- go语言映射操作
- PyTorch 18. torch. backends. cudnn
- USO technology was invited to share the technical framework and challenges of AI synthetic virtual characters at lvson2020 conference
- 浅谈BFC(块格式化上下文)
- 自定义classloader并实现热部署-使用loadClass
- pytorch:关于GradReverseLayer实现的一个坑
猜你喜欢
Beifeng communication helps Zhanjiang fire brigade build PDT wireless communication system
F. The wonderful use of pad
PyTorch 10. Learning rate
Lead the industry trend with intelligent production! American camera intelligent video production platform unveiled at 2021 world Ultra HD Video Industry Development Conference
城市应急管理|城市突发事故应急通信指挥调度系统
How to improve the service efficiency of the hotel without blind spots and long endurance | public and Private Integrated walkie talkie?
The people of Beifeng have been taking action
Typora语法详解(一)
Typora操作技巧说明(一).md
jvm知识点汇总-持续更新
随机推荐
特殊成员与魔法方法
remote: Support for password authentication was removed on August 13, 2021.
可视化之路(十二)Collection类详解
按需引入vant组件
el-table 横向滚动条固定在可视窗口底部
启动mqbroker.cmd失败解决方法
后台管理系统框架,总有你想要的
社区版阿里MQ普通消息发送订阅Demo
javscript获取文件真实后缀名
Wireless communication system for large-scale sports events
Patrol inspection intercom communication system in power industry
el-date-picker中自定义快捷选项picker-options,动态设置禁用日期
海康威视面经总结
xdotool按键精灵
PyTorch 9. optimizer
免费开源智能充电桩物联网SAAS云平台
null和undefined的区别
字节数仓实习生面试sql题
利用mysql-binlog恢复数据
Meishe helps Baidu "Duka editing" to make knowledge creation easier