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

Solution - P2292 [HNOI2004] L 语言

也不知道今天会不会把 P2414 做掉,先写一下吧。

看了一下午题解没看懂,也算是对 ACAM 有了一个比较深刻的理解。


首先看到多模匹配我们肯定先把 ACAM 建出来。

然后一个比较显然的想法是设 \(dp_i\) 为前缀 \([1,i]\) 是否是可理解的,然后对于每一个前缀在 ACAM 上匹配以后跳 fail,如果发现这个前缀的一个长度为 \(j\) 的后缀是一个模式串且 \([1,i-j]\) 也是可理解的,那么说明 \([1,i]\) 可理解(把两部分拼起来),于是将 \(dp_i\) 置为真。答案就是最后一个 \(dp_i\) 为真的位置。

然后喜提 \(\mathrm{O}(|s| \cdot \Sigma |t|)\) 的复杂度,拿到了 80 pts。


怎么办呢?

考虑到 \(|s| \le 20\),可知对更新 \(dp_i\) 有用的下标只可能往前推 \(20\) 位,即 \(dp_{i-20}\)。然而我们还是需要优化掉跳 fail 的时间。那么,因为最多只会跳 \(20\) 次 fail,我们就可以考虑把跳 fail 的过程,即找可理解后缀的过程,压到 ACAM 本身上。具体地,我们维护一个 \(f_{i,j}\),表示 ACAM 上节点 \(i\) 表示的字符串里长度为 \(j\) 的那一个是否可理解。由于只有 \(20\),我们可以直接压进 int。

然后我们维护一个滚动数组(滚动 int?)描述 \(dp_{(i-20) \sim i}\),然后跑的时候对两个位与一下,如果结果不为 \(0\),就说明至少有一个 \(k\) 满足子串 \([1, i-k]\)\([i-k+1, i]\) 都可理解,存一下就行了。

然后就做完了。

#include <bits/stdc++.h>
#define llong long long
#define N 1000006
using namespace std;char a[N], b[N];
int son[N][26], nxt[N], dep[N], tag[N], f[N], tsiz = 1;
int n, q, l;int que[N], he, ta;int main(){scanf("%d %d", &n, &q);for(int i = 1; i <= n; ++i){scanf("%s", a+1);l = strlen(a+1);int x = 1;for(int j = 1; j <= l; ++j){if(!son[x][a[j]^96]) son[x][a[j]^96] = ++tsiz;dep[son[x][a[j]^96]] = dep[x]+1;x = son[x][a[j]^96];}tag[x] = true;}he = 1, ta = 0;tag[1] = f[1] = true;for(int i = 1; i <= 26; ++i){if(son[1][i]) nxt[son[1][i]] = 1, que[++ta] = son[1][i];else son[1][i] = 1;}while(he <= ta){int x = que[he++];f[x] = f[nxt[x]]|(tag[x]<<dep[x]);for(int i = 1; i <= 26; ++i){if(son[x][i]) nxt[son[x][i]] = son[nxt[x]][i], que[++ta] = son[x][i];else son[x][i] = son[nxt[x]][i];}}while(q--){scanf("%s", b+1);l = strlen(b+1);int x = 1, now = 1, ans = 0;for(int i = 1; i <= l; ++i){now <<= 1, x = son[x][b[i]^96];if(now & f[x]) ans = max(ans, i), now |= 1;}printf("%d\n", ans);}return 0;
}
http://www.jsqmd.com/news/346964/

相关文章:

  • app内手机防盗功能基本开发完成
  • 系统思考与组织效率
  • 做员工福利平台的公司有哪些?企业福利平台该怎么选,深度解析 - 速递信息
  • 大四毕业生亲测有效的降AI实战笔记,免费降AI指令+专业将AI工具,轻松降低AI率
  • 2026年河北画室集训实力推荐榜:纵横美术/大画室/小画室/联考成绩/小班教学深度解析,专业口碑与高分保障之选 - 品牌企业推荐师(官方)
  • 2026年 屏蔽箱厂家推荐排行榜:屏蔽室/屏蔽柜/射频屏蔽箱/OTA屏蔽箱等全品类专业屏蔽设备实力品牌深度解析 - 品牌企业推荐师(官方)
  • [豪の算法奇妙冒险] 代码随想录算法训练营第四十一天 | 121-买卖股票的最佳时机、122-买卖股票的最佳时机Ⅱ、123-买卖股票的最佳时机Ⅲ
  • JAVA - 并发之内存模型
  • 2026年论文降AI保姆级教程:手把手教你如何降AI,将80%的AI疑率降至5%
  • 太空生物计算融合趋势:测试从业者的新机遇
  • 2026年南京汽车租赁品牌推荐榜:轿车/包车/会议用车/旅游包车/企业用车/商务车/政企用车全方位租赁服务深度解析 - 品牌企业推荐师(官方)
  • AI驱动的星际合作协议:2026太空法下的测试从业者洞察
  • 基于深度学习的web端多格式纠错系统(源码+文档)
  • 揭秘数据库性能优化:连接池的五大核心作用
  • 生物测试架构师稀缺性危机:数据透视与行业影响
  • 2026多校冲刺省选模拟赛5
  • 为什么测试工程师更需要抗扰大脑?
  • P1429 学习笔记
  • OpenClaw+Sealos组合拳:我司的AI Agent开发效率直接翻了4倍
  • 资治通鉴-名言
  • python3.12报错:ModuleNotFoundError: No module named imp
  • ubuntu上nodejs的安装
  • 小程序开发实战:微信小程序云开发实现用户登录与数据存储
  • 别手动协调Agent了,OpenClaw的事件驱动调度让我少熬了20个夜
  • ue5 迁移 导出使用笔记
  • Spark自适应查询执行:智能优化大数据作业
  • 你能解释一下什么是JVM吗?它是如何工作的?
  • P4913 【深基16.例3】二叉树深度 dfs-二叉树的遍历
  • 未来5年IT人才需求前瞻?哪些方向爆发?哪些岗位会萎缩?程序员的职业规划重要吗?
  • 基于SpringBoot+Vue的智慧社区服务管理系统设计与实现