P4022 [CTSC2012] 熟悉的文章 题解

news/2025/2/24 17:40:04/文章来源:https://www.cnblogs.com/laoshan-plus/p/18734560

P4022 [CTSC2012] 熟悉的文章

容易发现,能和 SAM 搞在一起的东西还挺多的。

首先要求最大的 \(L\),显然这个 \(L\) 是满足单调性的:若 \(L\) 合法,则 \(L-1,L-2,\dots\) 都合法。所以考虑二分这个 \(L\)

首先看到这个序列分段,应该想到经典的 DP:设 \(f_i\) 表示到第 \(i\) 个位置最长能匹配多长的字符串,那么显然有转移方程

\[f_i=\max\{f_j+i-j\}~,\quad j\in[i-w_i,i-L] \]

其中 \(w_i\) 是以 \(i\) 为结尾的字符串出现在模板串中的最长长度。用 SAM 处理这个东西应该是基操,考虑到题目中给出了多个模板串,所以套广义 SAM 的板子就可以处理出它。

现在复杂度是 \(O(n^2)\) 的,但是注意到随着 \(i\) 的增加,\(j\) 的合法取值范围是一个滑动窗口,可以采用单调队列优化,复杂度变为 \(O(n)\)

#include<bits/stdc++.h>
using namespace std;constexpr int MAXN=2.2e6+5;
int N,M,n,w[MAXN];
struct{int tot=1;struct Trie{int fa,c,s[2];}t[MAXN];void ins(const string&s){int p=1;for(int c:s){c-='0';if(!t[p].s[c]){t[p].s[c]=++tot;t[tot].fa=p,t[tot].c=c;}p=t[p].s[c];}}
}T;
struct{int tot=1;struct SAM{int len,fa,s[2];}sam[MAXN];int ins(int x,int lst){sam[++tot].len=sam[lst].len+1;int pos=lst,ch=T.t[x].c;lst=tot;while(pos&&!sam[pos].s[ch]){sam[pos].s[ch]=tot;pos=sam[pos].fa;}if(!pos) sam[tot].fa=1;else{int p=pos,q=sam[pos].s[ch];if(sam[p].len+1==sam[q].len) sam[tot].fa=q;else{sam[++tot]=sam[q];sam[tot].len=sam[p].len+1;sam[q].fa=sam[lst].fa=tot;while(pos&&sam[pos].s[ch]==q){sam[pos].s[ch]=tot;pos=sam[pos].fa;}}}return lst;}void build(){queue<pair<int,int>>q;for(int i=0;i<2;i++) if(T.t[1].s[i]) q.emplace(T.t[1].s[i],1);while(!q.empty()){int u=q.front().first,lst=q.front().second;q.pop();int now=ins(u,lst);for(int i=0;i<2;i++) if(T.t[u].s[i]) q.emplace(T.t[u].s[i],now);}}void initw(const string&s){int lst=0,pos=1;for(int i=1;i<=n;i++){int c=s[i]-'0';if(sam[pos].s[c]) lst++,pos=sam[pos].s[c];else{while(pos&&!sam[pos].s[c]) pos=sam[pos].fa;if(!pos) lst=0,pos=1;else lst=sam[pos].len+1,pos=sam[pos].s[c];}w[i]=lst;}}int q[MAXN],f[MAXN];bool check(int x){int h=1,t=0;memset(f,0,x<<2);for(int i=x;i<=n;i++){f[i]=f[i-1];while(h<=t&&f[q[t]]-q[t]<=f[i-x]-i+x) t--;q[++t]=i-x;while(h<=t&&q[h]<i-w[i]) h++;if(h<=t) f[i]=max(f[i],f[q[h]]+i-q[h]);}return n*0.9<=f[n];}
}S;int main(){cin.tie(nullptr)->sync_with_stdio(0);cin>>N>>M;for(int i=1;i<=M;i++){string s;cin>>s;T.ins(s);}S.build();for(int i=1;i<=N;i++){string s;cin>>s;n=s.size();s=' '+s;S.initw(s);int l=0,r=n,ans=0;while(l<=r){int mid=(l+r)>>1;if(S.check(mid)) ans=mid,l=mid+1;else r=mid-1;}cout<<ans<<'\n';}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889104.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

战神电话app版本过低怎么办更新最新版本

您的App版本过低,已无法使用,请升级App,您的App版本过低,已经停止提供烧录等功能,并即将停用全部功能,请记录设备密码并及时升级App 战神电话app最新版本,战神电话app版本过低怎么办, 怎么更新到最新版本,版本过低有什么app可以代替,不能继续使用app的用户,可以联系升…

Language-only Efficient Training of Zero-shot Composed Image Retrieval

目录概LinCIR代码Gu G., Chun S., Kim W., Kang Y. and Yun S. Language-only efficient training of zero-shot composed image retrieval. CVPR, 2024.概 本文提出了一种仅在文本上训练的 Zero-Shot Composed Image Retrieval (ZS-CIR) 方法. LinCIR上图展示了一种最为常见的…

vue中接收接口数据控制svg图转动

前段时间做了svg图放到vue项目中项目,实时展示监控堆垛机、线体、告警等实时信息,还有暖通、废气、水处理、进料等系统的实时数据,直接展示在svg图上,并且部分系统设备能下发设备参数或者开关控制设备。在之前已经讲过《vue集成svg大图拖拽无限放大缩小》、《vue若依集成C#…

DeepSeek-R1 1.5b、7b、8b、14b、32b、70b、671b 都是什么鬼?

大家好,我是R哥。 你是不是被 DeepSeek-R1 1.5b、7b、8b、14b、32b、70b、671b 这些概念绕晕了? 如图所示:DeepSeek-R1 模型有好几种规格,比如 1.5b、7b、8b、14b、32b、70b、671b,后面的数字代表模型的参数量,而 b 则是指 “billion” 的意思,也就是十亿,表示这个模型…

北京智和信通:全方位智能 OLT、ONU 设备监控运维方案

北京智和信通OLT、ONU监控运维方案自动发现网络中不同品牌、型号的OLT设备,统一纳管,集中监控,动态呈现OLT、ONU设备的运行态势,通过对OLT、ONU设备的有效监控和管理,保障OLT、ONU设备的高效运行,及时发现并解决潜在问题,保障网络稳定。 随着网络技术的不断迭代与…

Redis低版本客户端Jedis2.9.0兼容高版本redis(比如redis6)不支持ACL的问题(亲测可用)

redis6版本及以上使用了acl认证 就是通过账号密码去认证,但是在之前版本都是只需要密码的,这种如果要适配,可能就要升级jedis客户端依赖的,但是一些老项目都不能随便升级的 之前的代码可能就不适配了 如果就要考虑使用现有的jedis版本 如:2.9.0 去支撑redis6的连接 以下有…

Linux 中sed命令的整行替换

Linux 中sed命令的整行替换.001、基本用法[root@PC1 test2]# ls a.txt [root@PC1 test2]# cat a.txt ## 测试文件 a UU i a UU i b q j c q y [root@PC1 test2]# sed /b/ s/.*/QQ/ a.txt ## 将匹配b的行全部替换为Q…

高科战神拨号精灵app下载设置方法

高科战神拨号助手、拨号健、全家软件下载,高科拨号精灵app使用设置方法说明:首先用安卓手机安装拨号助手app【联系图片上的V信 2081003456下载】。安装好后拨12345678进行蓝牙连接,蓝牙连接好后就可以进行操作。1拨号 2拨号 3拨号 4拨号 5拨号 关闭程序 12345678拨号设置。

Spherical Linear Interpolation and Text-Anchoring for Zero-shot Composed Image Retrieval

目录概Spherical Linear Interpolation (Slerp)Text-Anchored-Tuning (TAT)代码Jiang Y. K., Huynh D., Shah A., Chen W. and Lim S. Spherical linear interpolation and text-anchoring for zero-shot composed image retrieval. ECCV, 2024.概 本文提出了一种非常简单的 Ze…

uniapp + 微信小程序:新版canvas常用api及注意事项

关于新旧canvas的比较我以前写过一篇博客 :https://www.cnblogs.com/sunshine233/p/17014701.html ,这里就不重复了。 但在正文开始之前,我不得不再说一遍微信的文档写的真垃圾。很多问题的答案都是在微信开发者社区里找到的。一、新版canvas 基础用法:<template><…

Java 实现 Excel(XLS/ XLSX)和 HTML 格式之间的转换

Excel 是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,以便更好地利用和展示数据。本文将介绍如何通过 Java 实现 Excel 与 HTML 格式之间的相互转换。将Exce…

Python异步编程终极指南:用协程与事件循环重构你的高并发系统

title: Python异步编程终极指南:用协程与事件循环重构你的高并发系统 date: 2025/2/24 updated: 2025/2/24 author: cmdragon excerpt: 🚀 深入剖析Python异步编程的核心机制。你将掌握:\n 事件循环的底层实现原理与调度算法\n async/await协程的6种高级用法模式\n 异步H…