1 条题解
-
0
题解
思路
字符串长度最多为 ,所以可以把所有票片按“长度、数位和”分类计数。对于一对长度奇偶性不同的字符串,总长度为奇数,一定不合法。其余情况下,幸运票的中点要么落在左串内部,要么落在两个等长字符串的边界上,要么落在右串内部。
做法
先统计
cnt[len][sum],表示给定票片中长度为len、数位和为sum的字符串数量。枚举一个长串 ,再枚举与它同奇偶性的较短长度 :
- 当 放在左侧时,中点位于 内。设中点以前的 前缀数位和为 , 总数位和为 ,则右侧短串数位和必须为 。
- 当 放在右侧时,中点位于 内。设中点以前、属于 的前缀数位和为 ,则左侧短串数位和必须为 。
两种需求都可在计数表中常数时间查询。长度相等时中点恰在连接处,只需在第一种计算中统计一次,避免重复。
正确性证明
任意合法有序对的两个长度必须同奇偶。若左串不短于右串,中点必在左串内部或连接边界上,算法第一种计算根据两半数位和相等式得到唯一所需的右串数位和,并统计且仅统计这些右串。若左串更短,中点严格位于右串内部,算法第二种计算同理得到唯一所需的左串数位和。
两种情况按长度大小互斥并覆盖全部有序对;等长情况只在第一种计算中出现一次。因此每个幸运有序对恰被统计一次,非幸运对不会满足相应等式,算法答案正确。
复杂度分析
设最大字符串长度为 。时间复杂度为 ,空间复杂度为 ;答案须使用 64 位整数。
子任务说明
- 时直接枚举 个有序对。
- 所有字符串等长时,中点总在连接处,只需按数位和计数。
- 满数据按长度和数位和处理长串位于左右两侧的需求。
- 1
信息
- ID
- 1067
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者