上海科技大学程序设计竞赛社团 edited 1 年,8 月前
设
由题意可以得到递推关系
(
设
由于要满足吃骨头的规律,
当
此外,因为最后一条狗也要能够按照规律吃骨头,因此
仍然由于
代入式子,
因此答案为
注意边界情况啊,少年
先考虑
设 E[i]
。
那么一段音符
很明显
然而
证明:假设在原有字符串后面新加上一个字符长度变成
,那么新产生的本质不同的回文串一定是以 结尾的、最长的那个回文串 。任何结尾于 ,且长度短于 的回文串 ,由对称性,都可以在 中找到一个相同的回文串 ,因此这个串重复出现过,不是新的”本质不同的串”。那么长度为 的回文串,最多只有 个本质不同的回文串。
证明:若长度
的字符串 ,那么本质不同的回文串数量就会超过 ,与总长度为 矛盾。
那么用类似于 manacher 的算法处理回文串,得到的 manacher 中的辅助数组 p[i]
, 可以用这个计算所有可能的本质不同的回文子串,使用字符串哈希,将所有本质不同的子串的哈希值放入一个unordered_set
(哈希) 中。考虑如何处理询问,使用根号分治:
询问的两个字符串的长度
询问的两个字符串,一个长度 unordered_set
中查询是否存在相同回文串。复杂度
询问的两个字符串 unordered_set
中查询是否存在相同的回文串。对于
询问的时候枚举短串,然后把答案记忆化到 std::unordered_map
里,就能AC。这不是数据水,而是复杂度正确
(使用回文自动机可以避开字符串哈希,复杂度同样为
PS: 为了卡掉复杂度不对的做法,造数据时想办法卡满了分块的复杂度,导致一些大常数程序无法通过
结论:一个研究方向
先假设我们只能进行一次操作(定义一次操作为若干次 improve 后再 reduce),那么
即
由 Bezout 定理,这个方程如果要有解,必要条件是满足
综上我们证明了,如果只能进行一次操作,那么
因此
利用数论分块快速求上述式子,利用杜教筛等算法可以在 map
把计算过的值进行记忆化,避免重复计算。总复杂度
本次比赛中出现了比较多的小问题,比如输入格式上下文不符、空格换行不分、题目描述不清、测试数据有误等等。这些问题都是由于我们的疏忽导致的,在这里向大家真诚道歉。希望大家在本题解下方点赞支持一下
尽管我们在赛时采取了迅速有效的办法进行补救(以上问题均在
感谢大家参加2023 年上海市大学生程序设计竞赛 - 七月赛,希望大家能够在比赛中有所收获。如果有任何疑问,欢迎在讨论区指正。如果你的做法更厉害或者有其他想吐槽或者讨论的,欢迎在此处评论区,或者ShanghaiTech-ACM OJ指出。
鸣谢:上海交通大学俞勇老师、华东师范大学肖春芸老师、华东师范大学汪鼎尊同学、上海科技大学科道书院汤飞龙老师、信息学院屠可伟、杨思蓓、闻天明老师的大力协助。没有你们本场场比赛难以顺利进行。此外,感谢上海科技大学黄磊、曹宇涵同学,清华大学彭思进、高子翼同学,北京师范大学香港浸会大学联合国际学院李欣泽同学和北京理工大学周行健同学对于本套试题的贡献。此致,
敬礼!祝各位选手前程似锦!
上海科技大学程序设计竞赛社团
地址:上海市浦东新区华夏中路393号上海科技大学信息学院 1B-205 室