-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
- Loading branch information
There are no files selected for viewing
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
{"posts":[{"title":"Manacher 算法学习笔记","text":"Manacher 算法于 1975 年发明,用其发明者的名字命名。 Manacher 是一个线性解决回文子串问题的算法。 Manacher 算法适用于处理字符串的所有回文子串,而并非只适用于通常意义上的最长回文子串,具体见下文解释。 前置知识考虑如何描述一个字符串里的回文子串。 比较简单的想法是记该子串的左右端点,将其记为 $[l,r]$。然而对于一个回文子串的子串 $[l+d,r-d]$ 它同样是一个回文子串;除非我们用较为复杂的方法记录这个回文子串的子串,否则需要用另外的空间来描述和储存,这造成了浪费。 另一个利用回文串性质的记法是记录其对称中心和对称长度。例如对于字符串 DBABCBAB 中的子串 ABCBC,我们就可以记其为 $[5,3]$。 对于偶数长度的回文串,我们考虑在每两个字符间插入一个字符,例如 #。同时我们要在头尾插入一些指示字符,辅助下面算法的判断。例如把上面的串变成:$D#B#A#B#C#B#A#B。 通过上述记法结合回文串性质可以发现 $[5,2]$,$[5,1]$ 均为回文子串。我们就可以小改以上这个记法为记录其对称中心和最大对称长度。也就是说 $[5,3]$ 可以说明以 $5$ 为对称中心实际上存在 $3$ 个回文子串。 Manacher 可以用 $O(n)$ 的复杂度求出每一个对称中心的最长对称长度。因此,之前说有人对该算法存在误解,其实我们是可以知道所有回文子串的。 算法考虑一个中心扩展算法。 Unfixed","link":"/2023/11/02/Manacher-%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"P9816 少项式复合幂 题解","text":"简要题意称一个项数小于等于 $20$ 的多项式为一个少项式。 求一个少项式的 $y$ 次复合函数在 $x$ 点上 $f_{y}(x)\\bmod p$ 的值。 解题思路题目强调注意 $m,p$ 的范围,观察发现 $p$ 的范围在 $10^5$ 之内。 关于模运算,它拥有以下显然的性质: (x + y)\\bmod p = (x\\bmod p + y\\bmod p) (x \\times y)\\bmod p = ((x\\bmod p)\\times (y\\bmod p))\\bmod p所以对于一个多项式函数有等式 $f(x) \\bmod p = f(x\\bmod p)\\bmod p$ 存在。不明白的想想你的快速幂为什么对。 f(x)\\bmod p = \\sum_{i = 1}^{m} a_i x^{b_i} \\bmod p = \\sum_{i = 1}^{m} (a_i (x\\bmod p)^{b_i} \\bmod p) \\bmod p如上柿我们可以用 $O(m\\log\\max\\{b\\})$ 的时间预处理出所有 $0\\le x < p$ 的 $f(x)\\bmod p$,$O(1)$ 地快速进行回答。 然后应该初学者都能想到通过 $y$ 次迭代求得 $f_y(x)\\bmod p$,关键在于将迭代的复杂度降低。 考虑进行倍增,因为有 $f_{2^k}(x) = f_{2^{k - 1}}(f_{2^{k - 1}}(x))$。 令 $st_{x,k} = f_{2^k}(x)$ 则我们可以通过 $O(\\log y)$ 的迭代求得答案。 st_{x,k} = \\begin{cases} f(x)\\bmod p & k = 0 \\\\ st_{st_{x,k - 1},k - 1} & \\mathrm{Otherwise.}\\\\ \\end{cases}需要注意的是,因为 $y\\le 10^7$,因此枚举 $k$ 直到 $2^k > 10^7$。 贴个代码这里令 $f_{x,k} = st_{x,k}$。 123456789101112131415161718#define rep(i, l, r) for (int i = (l); i <= (r); ++i)constexpr int Y = 1e7 + 10;rep (i, 0, p - 1) rep (j, 1, m) f[i][0] = (f[i][0] + 1ll * a[j] * fpow(i, b[j]) % p) % p;for (int j = 1; (1 << j) <= Y; ++j) rep (i, 0, p - 1) f[i][j] = f[f[i][j - 1]][j - 1];rep (i, 1, q){ cin >> x >> y; x %= p; for (int k = 30; ~k; --k) if ((1 << k) & y) x = f[x][k]; cout << x << endl;}","link":"/2023/10/29/P9816-%E5%B0%91%E9%A1%B9%E5%BC%8F%E5%A4%8D%E5%90%88%E5%B9%82-%E9%A2%98%E8%A7%A3/"},{"title":"P5377 [THUPC2019] 鸽鸽的分割 题解","text":"简要题意连结圆上 $n$ 个点,求最多能够把圆分成几个部分。 前置知识欧拉公式:$F(ace)=E(dge) - V(ertex)+2$ 人话:$\\text{多边形面数} = \\text{边数} - \\text{顶点数} + 2$ 思路将一个圆折叠成一个多面体,你可以进行一些奇妙的空间变换来达到这一点。 那么我们最后会多出一个底面。 因此在我们的这个圆中 $F(n)=E-V+1$ 求 $V$圆上已经有了 $n$ 个点。我们要使得圆内不存在三线共点的情况。 那么考虑每次选择四个顶点画出一个四边形的两条对角线。 于是又会生成 $C_{n}^{4}$ 个顶点。可以证明已经考虑完全了,于是有 V = n + C_{n}^{4}求 $E$原有 $C_{n}^{2}$ 条边,且圆环上的 $n$ 个点互相连接构成 $n$ 条边。 每多一个交点会增加两条多边形边。又有 $2\\times C_{n}^{4}$ 条。 E = n + C_{n}^{2} + 2\\times C_{n}^{4}最后,我们展开这个逆天的柿子: \\begin{aligned} F(n) &= E - V + 1 \\\\ &= n + C_{n}^{2} + 2\\times C_{n}^{4} - n - C_{n}^{4} + 1 \\\\ &= C_{n}^{2} + C_{n}^{4} + 1 \\\\ &= \\dfrac{n(n - 1)}{2} + \\dfrac{n(n - 1)(n - 2)(n - 3)}{4\\times 3 \\times 2} + 1 \\\\ &= \\dfrac{x^4}{24} - \\dfrac{x^3}{4} + \\dfrac{23x^2}{24} - \\dfrac{3x}{4} + 1 \\end{aligned}去 OEIS 上校验结果,正确。","link":"/2023/10/27/P5377-THUPC2019-%E9%B8%BD%E9%B8%BD%E7%9A%84%E5%88%86%E5%89%B2-%E9%A2%98%E8%A7%A3/"},{"title":"在随便哪一台电脑上写博客?- Hexo 多端同步","text":"将 Github 运用到底! 再来个奇妙小仓库还是太麻烦了,我们使用分支功能。 启用同步在第一用户端的博客根目录下 Git Bash 新建一个仓库。 1git init 然后确保你的 .gitignore 文件里屏蔽了以下目录和文件的提交。 12/.deploy_git /public 添加该仓库到远程仓库列表: 12345git remote add origin [your github repository]# 例如作者本人的:# git remote add origin [email protected]:YttriumWillow/yttriumwillow.github.io.git# 这是 SSH 模式下的提交,你的远程仓库 HTTPS 地址可能是这样# https://github.com/username/username.github.io.git 一路提交更改到 hexo 分支。 1234git add . # 将变更添加到 git 暂存区 git commit -m "[comment]" # 提交本次更改,并附加提交信息git push origin main:hexo # 将本地 main 分支的提交发布到远程仓库的 hexo 分支# 我为了省事用的 main 主分支,有的仓库的默认分支可能是 master 你的 Github 仓库里面就会出现这个分支。 在其他设备上同步如果这是一台全新的设备, 请先安装 Git, Node.js 并更新 npm。 打开你需要同步该文件的目录并启动终端。 使用 Git 同步: 1git clone -b hexo [your github repository] 安装 hexo 依赖: 123npm install hexo-cli -gnpm installnpm install hexo-deployer-git # 这东西好像会同步到 package.json 但最好安装一下 已经同步完毕。使用 hexo g / hexo s 进行测试。 更新博客前请先 pull 进行同步。 1git pull origin hexo 更新结束后提交修改。 123git add . git commit -m "[comments]" git push origin main:hexo 你可以直接使用 bat 来做到一键完成这些功能。 这样我们就可以在不同的设备上写 hexo 博客了。","link":"/2023/11/04/%E5%9C%A8%E9%9A%8F%E4%BE%BF%E5%93%AA%E4%B8%80%E5%8F%B0%E7%94%B5%E8%84%91%E4%B8%8A%E5%86%99%E5%8D%9A%E5%AE%A2%EF%BC%9F-Hexo-%E5%A4%9A%E7%AB%AF%E5%90%8C%E6%AD%A5/"}],"tags":[{"name":"OI","slug":"OI","link":"/tags/OI/"},{"name":"博客","slug":"博客","link":"/tags/%E5%8D%9A%E5%AE%A2/"}],"categories":[{"name":"OI","slug":"OI","link":"/categories/OI/"},{"name":"博客","slug":"博客","link":"/categories/%E5%8D%9A%E5%AE%A2/"}],"pages":[]} | ||
{"posts":[{"title":"Manacher 算法学习笔记","text":"Manacher 算法于 1975 年发明,用其发明者的名字命名。 Manacher 是一个线性解决回文子串问题的算法。 Manacher 算法适用于处理字符串的所有回文子串,而并非只适用于通常意义上的最长回文子串,具体见下文解释。 前置知识考虑如何描述一个字符串里的回文子串。 比较简单的想法是记该子串的左右端点,将其记为 $[l,r]$。然而对于一个回文子串的子串 $[l+d,r-d]$ 它同样是一个回文子串;除非我们用较为复杂的方法记录这个回文子串的子串,否则需要用另外的空间来描述和储存,这造成了浪费。 另一个利用回文串性质的记法是记录其对称中心和对称长度。例如对于字符串 DBABCBAB 中的子串 ABCBC,我们就可以记其为 $[5,3]$。 对于偶数长度的回文串,我们考虑在每两个字符间插入一个字符,例如 #。同时我们要在头尾插入一些指示字符,辅助下面算法的判断。例如把上面的串变成:$D#B#A#B#C#B#A#B。 通过上述记法结合回文串性质可以发现 $[5,2]$,$[5,1]$ 均为回文子串。我们就可以小改以上这个记法为记录其对称中心和最大对称长度。也就是说 $[5,3]$ 可以说明以 $5$ 为对称中心实际上存在 $3$ 个回文子串。 Manacher 可以用 $O(n)$ 的复杂度求出每一个对称中心的最长对称长度。因此,之前说有人对该算法存在误解,其实我们是可以知道所有回文子串的。 算法考虑一个中心扩展算法。 Unfixed","link":"/2023/11/02/Manacher-%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"P5377 [THUPC2019] 鸽鸽的分割 题解","text":"简要题意连结圆上 $n$ 个点,求最多能够把圆分成几个部分。 前置知识欧拉公式:$F(ace)=E(dge) - V(ertex)+2$ 人话:$\\text{多边形面数} = \\text{边数} - \\text{顶点数} + 2$ 思路将一个圆折叠成一个多面体,你可以进行一些奇妙的空间变换来达到这一点。 那么我们最后会多出一个底面。 因此在我们的这个圆中 $F(n)=E-V+1$ 求 $V$圆上已经有了 $n$ 个点。我们要使得圆内不存在三线共点的情况。 那么考虑每次选择四个顶点画出一个四边形的两条对角线。 于是又会生成 $C_{n}^{4}$ 个顶点。可以证明已经考虑完全了,于是有 V = n + C_{n}^{4}求 $E$原有 $C_{n}^{2}$ 条边,且圆环上的 $n$ 个点互相连接构成 $n$ 条边。 每多一个交点会增加两条多边形边。又有 $2\\times C_{n}^{4}$ 条。 E = n + C_{n}^{2} + 2\\times C_{n}^{4}最后,我们展开这个逆天的柿子: \\begin{aligned} F(n) &= E - V + 1 \\\\ &= n + C_{n}^{2} + 2\\times C_{n}^{4} - n - C_{n}^{4} + 1 \\\\ &= C_{n}^{2} + C_{n}^{4} + 1 \\\\ &= \\dfrac{n(n - 1)}{2} + \\dfrac{n(n - 1)(n - 2)(n - 3)}{4\\times 3 \\times 2} + 1 \\\\ &= \\dfrac{x^4}{24} - \\dfrac{x^3}{4} + \\dfrac{23x^2}{24} - \\dfrac{3x}{4} + 1 \\end{aligned}去 OEIS 上校验结果,正确。","link":"/2023/10/27/P5377-THUPC2019-%E9%B8%BD%E9%B8%BD%E7%9A%84%E5%88%86%E5%89%B2-%E9%A2%98%E8%A7%A3/"},{"title":"P9816 少项式复合幂 题解","text":"简要题意称一个项数小于等于 $20$ 的多项式为一个少项式。 求一个少项式的 $y$ 次复合函数在 $x$ 点上 $f_{y}(x)\\bmod p$ 的值。 解题思路题目强调注意 $m,p$ 的范围,观察发现 $p$ 的范围在 $10^5$ 之内。 关于模运算,它拥有以下显然的性质: (x + y)\\bmod p = (x\\bmod p + y\\bmod p) (x \\times y)\\bmod p = ((x\\bmod p)\\times (y\\bmod p))\\bmod p所以对于一个多项式函数有等式 $f(x) \\bmod p = f(x\\bmod p)\\bmod p$ 存在。不明白的想想你的快速幂为什么对。 f(x)\\bmod p = \\sum_{i = 1}^{m} a_i x^{b_i} \\bmod p = \\sum_{i = 1}^{m} (a_i (x\\bmod p)^{b_i} \\bmod p) \\bmod p如上柿我们可以用 $O(m\\log\\max\\{b\\})$ 的时间预处理出所有 $0\\le x < p$ 的 $f(x)\\bmod p$,$O(1)$ 地快速进行回答。 然后应该初学者都能想到通过 $y$ 次迭代求得 $f_y(x)\\bmod p$,关键在于将迭代的复杂度降低。 考虑进行倍增,因为有 $f_{2^k}(x) = f_{2^{k - 1}}(f_{2^{k - 1}}(x))$。 令 $st_{x,k} = f_{2^k}(x)$ 则我们可以通过 $O(\\log y)$ 的迭代求得答案。 st_{x,k} = \\begin{cases} f(x)\\bmod p & k = 0 \\\\ st_{st_{x,k - 1},k - 1} & \\mathrm{Otherwise.}\\\\ \\end{cases}需要注意的是,因为 $y\\le 10^7$,因此枚举 $k$ 直到 $2^k > 10^7$。 贴个代码这里令 $f_{x,k} = st_{x,k}$。 123456789101112131415161718#define rep(i, l, r) for (int i = (l); i <= (r); ++i)constexpr int Y = 1e7 + 10;rep (i, 0, p - 1) rep (j, 1, m) f[i][0] = (f[i][0] + 1ll * a[j] * fpow(i, b[j]) % p) % p;for (int j = 1; (1 << j) <= Y; ++j) rep (i, 0, p - 1) f[i][j] = f[f[i][j - 1]][j - 1];rep (i, 1, q){ cin >> x >> y; x %= p; for (int k = 30; ~k; --k) if ((1 << k) & y) x = f[x][k]; cout << x << endl;}","link":"/2023/10/29/P9816-%E5%B0%91%E9%A1%B9%E5%BC%8F%E5%A4%8D%E5%90%88%E5%B9%82-%E9%A2%98%E8%A7%A3/"},{"title":"在随便哪一台电脑上写博客?- Hexo 多端同步","text":"将 Github 运用到底! 再来个奇妙小仓库还是太麻烦了,我们使用分支功能。 启用同步在第一用户端的博客根目录下 Git Bash 新建一个仓库。 1git init 然后确保你的 .gitignore 文件里屏蔽了以下目录和文件的提交。 12/.deploy_git /public 添加该仓库到远程仓库列表: 12345git remote add origin [your github repository]# 例如作者本人的:# git remote add origin [email protected]:YttriumWillow/yttriumwillow.github.io.git# 这是 SSH 模式下的提交,你的远程仓库 HTTPS 地址可能是这样# https://github.com/username/username.github.io.git 一路提交更改到 hexo 分支。 1234git add . # 将变更添加到 git 暂存区 git commit -m "[comment]" # 提交本次更改,并附加提交信息git push origin main:hexo # 将本地 main 分支的提交发布到远程仓库的 hexo 分支# 我为了省事用的 main 主分支,有的仓库的默认分支可能是 master 你的 Github 仓库里面就会出现这个分支。 在其他设备上同步如果这是一台全新的设备, 请先安装 Git, Node.js 并更新 npm。 打开你需要同步该文件的目录并启动终端。 使用 Git 同步: 1git clone -b hexo [your github repository] 安装 hexo 依赖: 123npm install hexo-cli -gnpm installnpm install hexo-deployer-git # 这东西好像会同步到 package.json 但最好安装一下 已经同步完毕。使用 hexo g / hexo s 进行测试。 更新博客前请先 pull 进行同步。 1git pull origin hexo 更新结束后提交修改。 123git add . git commit -m "[comments]" git push origin main:hexo 你可以直接使用 bat 来做到一键完成这些功能。 这样我们就可以在不同的设备上写 hexo 博客了。","link":"/2023/11/04/%E5%9C%A8%E9%9A%8F%E4%BE%BF%E5%93%AA%E4%B8%80%E5%8F%B0%E7%94%B5%E8%84%91%E4%B8%8A%E5%86%99%E5%8D%9A%E5%AE%A2%EF%BC%9F-Hexo-%E5%A4%9A%E7%AB%AF%E5%90%8C%E6%AD%A5/"}],"tags":[{"name":"OI","slug":"OI","link":"/tags/OI/"},{"name":"博客","slug":"博客","link":"/tags/%E5%8D%9A%E5%AE%A2/"}],"categories":[{"name":"OI","slug":"OI","link":"/categories/OI/"},{"name":"博客","slug":"博客","link":"/categories/%E5%8D%9A%E5%AE%A2/"}],"pages":[]} |