SAM练习记录
SAM练习记录
洛谷 P1368 工艺
其实是最小表示法裸题
倍长后建SAM跑最小的边走|S|步即可
CF 235 C. Cyclical Quest
对主串建SAM
然后每个串倍长,跑的时候维护一下匹配长度再更新答案,还有判断一个节点是否重复到达。
BZOJ1396: 识别子串
一开始写这个题的时候固执的认为是线段树合并..
显然出现次数为1的串的rigit集合大小为1,我们直接处理一下就好了,设Ta和Ta父亲的长度是\(len_x\)和\(len_p\)
那么在区间\([len_x-len_p,len_x]\)的都可以取\(len_p+1\),而在\([1,len_x-len_p+1]\)的都可以取\(len_x+1-i\)
分开放到两个线段树维护一下就可以了,也可以离线\(O(n)\)做
BZOJ2555: SubString
lct维护SAM裸题
动态维护par树并且维护一下子树大小就可以了
注意维护子树大小时link的时候x,y都要保证fa是0,wa了好久
「TJOI / HEOI2016」字符串
注意读题,一个是子串一个没有子串...
sam可以求最长公共后缀,所以先把串反过来。
考虑二分答案,每次从\(d\)在SAM上的那个点倍增向上跳,找到最短的那个大于当前答案的点,查询它的rigit集合是否在\([a+mid-1,b]\)区间,可以用线段树合并(可持久化线段树?)维护
「NOI2018」你的名字
68分:考虑统计两个串的本质不同公共子串个数。
方法:对S,T同时建SAM,然后在S的SAM上跑T这个串,可以得到T的每个\(i\)为末尾的串的在S中的匹配长度,然后把这个长度表示打到T的对应节点上面去,最后对T的par树跑一遍传一传标记。
100分:其实和68差不多
对S的SAM用线段树合并之类的维护一下right集合,然后每次还是跑匹配,并把标记打到T上去。
考虑到维护匹配长度,显然par树越上,right集合越大,我们可以查询right集合在不在区间里面。于是考虑二分一个匹配长度,然后倍增跳到对应节点,再线段树检测一下合不合法。
但仔细想一想这个过程,发现是可以直接暴力跳par树的,因为我们得满足势能嘛,就变成一个\(\log\)的了
跳的时候注意一下细节,我看大家写的都不咋一样,就不具体说了。
SAM练习记录的更多相关文章
- 【算法】后缀自动机(SAM) 例题
算法介绍见:http://www.cnblogs.com/Sakits/p/8232402.html 广义SAM资料:https://www.cnblogs.com/phile/p/4511571.h ...
- 【转】如何打开注册表编辑器中存储用户信息的SAM文件?
sam文件怎么打开 (Security Accounts Manager安全帐户管理器)负责SAM数据库的控制和维护.SAM数据库位于注册表HKLM\SAM\SAM下,受到ACL保护,可以使用rege ...
- Codeforces 666E Forensic Examination SAM or SA+线段树合并
E. Forensic Examination http://codeforces.com/problemset/problem/666/E 题目大意:给模式串S以及m个特殊串,q个询问,询问S的子串 ...
- 一步步学习 Spring Data 系列之JPA(二)
继上一篇文章对Spring Data JPA更深( )一步剖析. 上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求.这是当然的,在业务中查询 ...
- Javascript - ExtJs - 数据
数据(ExtJs Data) Ext.data命名空间 有关数据存储.读取的类都定义在Ext.data命名空间中.Ext的gridPanel.combobox的数据源都是来自Ext.data提供的类. ...
- Bzoj2780: [Spoj]8093 Sevenk Love Oimaster
题目 传送门 Sol 就是广义\(sam\) 然后记录下每个状态属于哪些串,开\(set\)维护 \(parent\)树上启发式合并一下就好了 # include <bits/stdc++.h& ...
- bzoj题目分类
转载于http://blog.csdn.net/creationaugust/article/details/513876231000:A+B 1001:平面图最小割,转对偶图最短路 1002:矩阵树 ...
- 【XSY2384】【GDOI2017】微信
致去年的我:这是道广义SAM模板题啊…… 题意: Description Input Output HINT $1\leq N\leq 20$,$1\leq Q\leq 10^5$,字符串总长$\le ...
- 【spoj2774】最长公共子串
题目描述: 给你两个字符串,求它们最长公共子串的长度,如果不存在公共子串则输出0. 样例输入: yeshowmuchiloveyoumydearmotherreallyicannotbelieveit ...
随机推荐
- js-XMLHttpRequest 2级
###1. XMLHttpRquest 2级 1) FormData 现代web应用中频繁使用的一项功能就死表单数据的序列化, XMLHttpRquest 2级为此定义了FormData类型 Fo ...
- java lang(ClassLoader)
一.什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程 ...
- Linux 下面RPM 安装的SQLSERVER 修改字符集的方法
1. 自己还是太low 2. 遇到问题 先 -h 处理 3. 发现登录报错, 怀疑是字符集的问题: 4. 计划是修改字符集 到 自己的环境可用的状态 使用命令 /opt/mssql/bin/mssql ...
- java的强制类型转换
java强制类型转换 详细连接https://www.cnblogs.com/kuangwong/p/6198862.html 在Java项目的实际开发和应用中,常常需要用到将对象转为String这 ...
- GitHub & OAuth 2.0 & JWT
GitHub & OAuth 2.0 & JWT https://www.rfcreader.com/#rfc6749 GitHub & OAuth https://www.b ...
- 老男孩python学习自修【第二天】字符串用法
实时处理增量日志最佳实践 主要使用f.seek()和f.tell()实现 字符串处理函数: s.find(substr, start, end) 查找子字符串,找不到则返回-1,找到则返回对应的索引 ...
- Yii的数值比较验证器
该验证器比对两个特定输入值之间的关系 是否与 operator 属性所指定的相同. compareAttribute:用于与原属性相比对的属性名称. 当该验证器被用于验证某目标属性时, 该属性会默认为 ...
- orecal基本连接数据库简介
整理自互联网 一. jdbc:oracle:thin:@192.168.3.98:1521:orcljdbc:表示采用jdbc方式连接数据库oracle:表示连接的是oracle数据库thin:表示连 ...
- python之if使用方法举例
if使用方法举例: import random #随机生成1-100的整数 n = random.randint(1, 100) if n > 50: print(n, "> 5 ...
- shell命令相关
1.服务端登录退出 登录服务器 ssh kayan.sjc@xx.xx.xx.67 退出登录:logout 192.168.0.10 2.目录管理 显示目录 pwd 创建目录 mkdir resour ...