当前位置: 首页 > news >正文

12.22 - 12.28 周总结

这一周练习了关于字符串专题。

复习了可持久化 trie,并学习了 AC 自动机。

AC 自动机

可以记录多个串互相的前缀关系,并用一个文本串可以匹配多个模式串。

简单来说就是在 trie 树上找 fail,具体方法是通过不断跳其父亲的 fail 来判断有没有这个相同的儿子,找到了则 fail 指向那个相等的节点,否则指向根(没有匹配)。

然而在实际使用中,可能需要一个点走向不是它原本儿子的字符,此时如果暴力跳 fail 就是不优的,所以可以提前处理它的其它儿子(指向它上面的点),这样就构成了 trie 图:每个点都能走向任意字符,保证 走到位置的串 和 当前串 + 字符 有最长的公共后缀,预处理整个过程的复杂度都是线性的,即为 \(\mathcal O(m)\),其中 \(m\) 为模式串总长。

代码
void add(string s) {int len = s.size(), u = 0;for(int i = 0; i < len; i++) {if(!son[u][s[i] - 'A']) son[u][s[i] - 'A'] = ++idx;u = son[u][s[i] - 'A'];}vis[u]++; // 模式串的结尾
}
void build_nfa() {queue<int> q;for(int i = 0; i < 26; i++) {if(son[0][i]) {fail[son[0][i]] = 0;q.push(son[0][i]);}}while(q.size()) {int u = q.front();q.pop();for(int i = 0; i < 26; i++) {if(son[u][i]) {fail[son[u][i]] = son[fail[u]][i]; // 儿子的 fail 就是自己 fail 的儿子vis[son[u][i]] += vis[fail[son[u][i]]]; // fail 链上是模式串结尾的个数q.push(son[u][i]);} else {son[u][i] = son[fail[u]][i]; // 不存在这样的儿子就到 fail 去找}}}
}

可以用 AC 自动机解决一些有子串限制的计数(在 trie 图上 DP)。

电脑游戏

题目 和 题目。

这种 AC 自动机 DP 的题目一般状态都定义为 \(dp_{u,i}\)\(u\) 表示走到了 \(u\) 号节点,\(i\) 表示考虑到文本串的第 \(i\) 位。

对于这道题,\(dp_{u,i}\) 就表示走到 \(u\) 且考虑了 \(i\) 位的最大得分。

\[dp_{v,i+1}=\min_{u\to v} (dp_{u,i}+val_v) \]

其中 \(val_v\) 表示 \(v\) 及其 fail 链中的点作为模式串末尾的总次数,也就是走这一步的得分。

DP 部分
dp[0][0] = 0;
for(int i = 0; i < k; i++) {for(int u = 0; u <= idx; u++) {if(dp[i][u] == -0x3f3f3f3f) continue;for(int j = 0; j < 3; j++) {int v = son[u][j];dp[i + 1][v] = max(dp[i + 1][v], dp[i][u] + vis[v]);}}
}

这周的周练没有挂分,不过除了 T1 并没有过题。

T2 和 T3 都是有性质的,都没发现。

T2 和 T2:一个数 \(x\) 不断变为 \((x+P) \bmod Q\) 是会有周期的,且 \([0,Q-1]\) 中的数组成的若干个周期总共正好是 \([0,Q-1]\)

T3 和 T3:考虑逆序对数变化时可以关注一个数前面比它大的数的个数的变化。

T4:最大(二进制)与生成树。一个方法是套用异或生成树的 01-trie 方法,其中把 0 的分支替换为 0 和 1 的 trie 树合并后的结果,然后正常做即可。

不过有更巧妙的解法,按照 kruskal 的方法从大到小枚举边权,考虑哪些点之间会有这样的边权,发现如果将 \(x\mid 2^j\) 看做 \(x\) 的父亲,则凡是有父亲的点想连的边由它的父亲来连是不会更劣的,所以套用这个思路,连向它的父亲并计算权值和即可。

http://www.jsqmd.com/news/161610/

相关文章:

  • Jupyter Notebook单元测试:验证PyTorch函数正确性
  • MATLAB代码:基于模型预测控制的楼宇负荷需求响应研究 关键词:楼宇负荷 空调 模型预测控制...
  • Jupyter Notebook主题切换:个性化开发界面风格
  • Git Merge Conflict解决冲突:整合多人PyTorch开发成果
  • 重组蛋白常用标签技术解析:科研级蛋白表达与纯化中的关键工具
  • SSH无密码登录配置:提高PyTorch服务器访问效率
  • Git Stash暂存更改:临时切换上下文处理紧急PyTorch任务
  • 【物流中心选址】智能优化算法在物流中心选址的应用附Matlab代码
  • PyTorch安装后无法调用GPU?试试这个预配置镜像方案
  • 从入门到精通:Nanoscope Analysis AFM数据处理全攻略
  • 【全栈前端老曹】2025年CSDN博客文章创作历程与技术心得年度总结
  • 基于PLC的交通灯控制系统交通信号灯十字路口红绿灯MCGS嵌入式组态仿真
  • SSH Config文件配置:简化频繁连接PyTorch服务器操作
  • 【先进PID控制算法(ADRC,TD,ESO)加入永磁同步电机发电控制仿真模型研究附Matlab代码
  • CNN特征可视化方法:理解PyTorch模型决策过程
  • PyTorch LRScheduler学习率调度器种类大全
  • PyTorch Early Stopping实现:防止模型过拟合策略
  • YOLOv5 Label Assignment改进:OTA标签分配策略
  • Git Ignore忽略文件:排除PyTorch缓存和日志干扰
  • Conda虚拟环境 vs 镜像化环境:谁更适合PyTorch开发?
  • Anaconda虚拟环境备份与恢复:保护PyTorch开发配置
  • GitHub Labels标签分类:组织PyTorch项目Issue
  • 【协同路径】多Dubins路径段协同路径规研究附Matlab代码
  • CUDA Streams并发执行:重叠PyTorch计算与数据传输
  • 配置Jenkins使用tag发布
  • 终身学习:构建能持续进化的AI Agent
  • GitHub Pull Request审查流程:协作改进PyTorch代码
  • Docker Top查看进程:观察PyTorch容器内部活动
  • CUDA共享内存优化:提升PyTorch张量操作效率
  • Linux 的日志分析命令