2024年2月21日
摘要: 字符串 难点:理解算法过程 二分 + 哈希 可以 $O(n log n) $ 完成 Manacher 和 exKMP Manacher P5446 R 是 S 的一个前缀 R[1, i] 的后缀的最大回文半径为 r 一次翻折:i + r == n 成立 多次翻折:目标串合法 且 目标串是一个回文串 阅读全文
posted @ 2024-02-21 22:01 Bubble_e 阅读(77) 评论(0) 推荐(0)
  2024年2月20日
摘要: P3435 设 \(Q = a[1, i]\),左端绿色虚线终点为 j 则 \(a[1, j] == a[i + 1, n]\),因为他们位于 Q 的相同位置 联想到 kmp 的 next 数组 \(len_Q = n - next[j]\) 只要找到最小的且非0的 \(next[j]\) 就可以最 阅读全文
posted @ 2024-02-20 21:05 Bubble_e 阅读(23) 评论(0) 推荐(0)
摘要: P5446 由翻转可知:\(S[j, k] == S[k, i]\) 因此 R 是 S 的前缀 且 R 的后缀是回文串 用 Manacher 算出最大回文半径 d 此外,R 也可以由多次反转得到 条件是: R' 经过反转后是符合R 是 S 的前缀 且 R 的后缀是回文串 的 且 R' 本身是回文串, 阅读全文
posted @ 2024-02-20 21:04 Bubble_e 阅读(33) 评论(0) 推荐(0)
  2024年2月19日
摘要: 根据唯一分解定理 \(n = p_1 ^ {a_1} * p_2 ^ {a_2} * p_3 ^ {a_3}...\) \(m = p_1 ^ {b_1} * p_2 ^ {b_2} * p_3 ^ {b_3}...\) \(Gcd(n, m) = p_1 ^ {min(a_1, b_1)} * p 阅读全文
posted @ 2024-02-19 22:10 Bubble_e 阅读(36) 评论(0) 推荐(0)
摘要: P3195 斜率优化 暴力转移: \(f(i)\) 表示考虑到第 \(i\) 个玩具达成的最小费用 \(f(i) = min(f(j) + (i - j + \sum_{j + 1}^{i} c - L) ^ 2)\) 设 \(s_i = \sum_1^i + i\) \(f(i) = min(f( 阅读全文
posted @ 2024-02-19 21:56 Bubble_e 阅读(40) 评论(0) 推荐(0)
摘要: ABC 341 D 赛时思路: 按 lcm 分周期处理 不可行的理由: a, b 在同一个周期里 排列无规律 lcm 可能很大(周期内最多能有 2e5 左右个数), 不好预处理 正解 二分(二分结果的值) 答案序列内数的排名单增 排名容易 Check mid / n + mid / m - (mid 阅读全文
posted @ 2024-02-19 12:37 Bubble_e 阅读(27) 评论(0) 推荐(0)
  2024年2月18日
摘要: Dfs序 CF383C 简化:子树加, 子树和(线段树 + Dfs 序) 考虑对树做一个奇偶的分层 x 的深度为奇数, x 子树中, 深度为奇数 + , 深度为偶数 - BZOJ3306 小技巧:换根, Dfs序 现在的根为 x, 原来的为 rt y 在 x 的子树内 -> 无影响 y 在 x 到根 阅读全文
posted @ 2024-02-18 14:30 Bubble_e 阅读(27) 评论(0) 推荐(0)
摘要: 栈, 队列 P6033 操作:找min, 删min, 插入 必须线性复杂度 **特殊的性质:每次插入的元素单调递增 **, 即 b 单调 两个队列:初始的 a, 合并后的 b, 都是有序的 对 a 排序时使用桶排序(快排太慢) 总共合并 n - 1 次, 每次 $O(1) $ P2827 如果蚯蚓长 阅读全文
posted @ 2024-02-18 14:29 Bubble_e 阅读(55) 评论(0) 推荐(0)
  2024年2月14日
摘要: Day-0 T1 从一点开始以固定方向行走,会出现循环节 该结论由 \(n = m\) 的测试点推出 判断两个串是否相同 字符串哈希 倍增预处理出长度为 $ 2 ^ {len} $​ 的循环节子串 T2 最小环计数 Floyd 会超时 计数由 $ x, y, st$ 构成的环 依题解代码 同学赛时代 阅读全文
posted @ 2024-02-14 21:24 Bubble_e 阅读(34) 评论(0) 推荐(0)
  2023年11月9日
摘要: # include <bits/stdc++.h> # define int long long using namespace std; const int N = 1e6 + 10; int n, m; int k[N], a, b, c; int val[N]; //如果一条边的两端点被同一个 阅读全文
posted @ 2023-11-09 21:12 Bubble_e 阅读(27) 评论(0) 推荐(0)