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

SAM详解3.2(关于2和3的题)

SAM

  • SAM
    • luogu6640
      • 分析
      • 优化
    • CF653F
      • 分析
      • 维护

SAM

推销一波前面的文章:

SAM详解1

SAM详解2(初级应用)

SAM详解3(SAM与AC自动机的相似性,SAM处理字符串匹配)

luogu6640

题目链接

给出只包含小写字母 ab 的两个字符串 s , t s,t s,t q q q 次询问,每次询问 s [ l … r ] s[l…r] s[lr] t t t 的最长公共子串长度。

分析

看到最长公共子串,建出 t t t 的 SAM,然后让 s s s 在上面跑匹配,记跑出来的数组是 s l e n slen slen

然后可以看出答案:

a n s = max ⁡ i = l r min ⁡ ( i − l + 1 , s l e n [ i ] ) ans=\max_{i=l}^r\min(i-l+1,slen[i]) ans=i=lmaxrmin(il+1,slen[i])

于是有了暴力 O ( q n ) O(qn) O(qn) 的做法。

优化

发现括号内的 min ⁡ \min min 不好维护,考虑拆括号。

i − l + 1 < s l e n [ i ] i-l+1<slen[i] il+1<slen[i] 时,有 i − s l e n [ i ] + 1 < l i-slen[i]+1<l islen[i]+1<l

然后有个性质 i − s l e n [ i ] + 1 i-slen[i]+1 islen[i]+1 单调不降。

证明:

回顾 s l e n slen slen 的计算过程:

	for(int i=1,p=1,L=0;i<=n;i++){while(p&&!a[p].ch[s1[i]-'a']){p=a[p].f;L=a[p].len;}if(!p)p=1;elsep=a[p].ch[s1[i]-'a'],L++;slen[i]=L;}

L L L 每次最多增加 1 1 1,或者减少。

i i i 每次稳定增加 1 1 1

得证。

于是可以用二分求出一个

相关文章:

  • 黑马k8s(二)
  • 子串简写(JAVA)一维前缀和, 蓝桥杯
  • 学习黑客5 分钟深入浅出理解cron [特殊字符]
  • 基于阿伦尼斯模型的电池寿命预测:原理、应用与挑战
  • 【智能指针】
  • SD06_前后端分离项目部署流程(采用Nginx)
  • SAP Commerce(Hybris)开发实战(一)
  • linux-----------Ext系列⽂件系统(上)
  • 进阶 DFS 学习笔记
  • 链表头插法的优化补充、尾插法完结!
  • DNS负载均衡和CDN的区别
  • CentOS 7 修改锁屏时间为永不
  • ADI ADRV902x的射频模拟信号输入输出端口的巴伦匹配
  • 暗物质卯引力挂载技术
  • [模型选择与调优]机器学习-part4
  • 电子电器架构 --- 新能源高压上下电那点事一文通
  • Kubernetes生产实战(十三):灰度发布与蓝绿发布实战指南
  • 2025年客运从业资格证备考单选练习题
  • sh脚本多卡顺序执行训练文件
  • Java 开发者 Linux 学习指南
  • “不为一时一事所惑,不为风高浪急所扰”——习近平主席对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典纪实
  • 泽连斯基:乌克兰已做好与俄罗斯举行会谈的准备
  • 重庆三峡学院回应“中标价85万设备网购300元”:已终止采购
  • 巴基斯坦外长:印巴已同意立即停火
  • 智利观众也喜欢上海的《好东西》
  • 呼和浩特推进新一轮国企重组整合:杜绝一项目一公司、一业务一公司