洛谷题单

后缀数组

前置芝士

后缀数组 1

后缀数组 2

后缀数组 3

例题略解

P2463 [SDOI2008]Sandy的卡片

板子题。。。

然而我还是不会。

大概做法就是先把所有的串差分后拼成一个大的串,小的串之间用一个极大数(比差分数组中最大的数大就可以)隔开。

并且确保每个用于隔开小串的数大小不同,每隔开一个\(+1\)就可以了。

然后进行二分答案就\(OK\)了

\(code\)

P2336 [SCOI2012]喵星球上的点名

SA+莫队

大概就是像上一个题一样,将所有的名字建成一个大串,记录一下所在名字,

然后对于每个询问预处理一下在SA数组左右的端点

之后的做法和莫队就是标准的莫队了。。。

\(code\)

P4094 [HEOI2016/TJOI2016]字符串

正解:主席树+SA+二分+RMQ

但是暴力做法远快于正解,而且码量思路也比较好想

还是那个推论2,对于以a到b开始的每个后缀都求一下,

然后在把推算结果与d-c+1取最小值。

  • 对于a到b中rk小于rk[c]的:

    从rk[c]开始,到height[i]小于ans就停止,如果i大于sa[a]小于sa[b]更新就好了
  • 对于a到b中rk等于rk[c]的:

    特判一下
  • 对于a到b中rk大于rk[c]的:

    把小于rk[c]的操作从rk[c]+1到n进行一边就好了

\(code\)

P4248 [AHOI2013]差异

单调栈+SA求LCP

比较易懂,大概就是先把题面上的式子简化一下,

变成某个带n的代数式加上LCP

\(∀1\leq i<j\leq n,\) \(LCP(sa_i,sa_j)=\min\limits_{i< k\leq j} (height_k)\)

然后运用LCP的推论2,将问题转化成了求每个子区间的最小值的加和

可以打权值线段树,但是太麻烦了,于是可以用单调栈来优化

  • 注意:

    在求SA时M所赋的初值应大于原序列中的最大值

\(code\)

BZOJ3230

SA+RMQ(ST表)+二分

每个字串都是一个后缀的前缀,先求一下SA以及LCP,

然后就可以预处理出每个后缀的左右边界值

在处理询问的时候进行二分,查看要查询的字串的左右端点在哪两个后缀中,

最后算一下就好了

  • 注意:

    对于每一个操作都要搞正反两遍

\(code\)

P2178 [NOI2015] 品酒大会

常规做法是并查集+SA(+set)

但是zxb用三棵线段树硬是给干过去了,做法么,和差异这个题差不多,tql%%%

用RMQ暴力有两种打法:

  • 最简单的也是得分最低的:

    每种情况都枚举一遍
  • 优化的暴力:对于不同的LCP都更新,然后累加

正解就是对于第二种暴力放弃RMQ,改用并查集维护,处理一个siz值,对于不同的点进行合并,这里用set维护了一下并查集

  • 注意:因为有负值,因此们要求max(最大值 * 次大值,最小值 * 次小值)

\(code\)

\(manacher\)

前置芝士

\(manacher\)

例题略解

P4287 [SHOI2011]双倍回文

半个板子题,有一个很妙的思路,在处理manacher的时候整一下,对于i=1的情况,循环一下i+p[i],如果j-i长度为4的倍数,更新答案。

毕竟,双倍的回文串还要计算上在每一位之间插进去的字符。


荣登最优解\(Top3\)


  • 注意:i&3表示 \(i\mod4\) ,同样的,i&7可以表示\(i\mod8\)

\(code\)

P4555 [国家集训队]最长双回文串

我真傻,真的,我单知道输入字符串从0开始,却不知道求manachar时也要从0开始处理

和上一题差不多,都是在manachar函数里搞事情

开一个l和r数组用来表示以i为分割点的所谓双回文串的左右端点,理论上来讲,l在最后取max时应该从n到2,r应该从2到n,防止更改过的对以后的有影响。但是数据他水呀

最后取一下\(l[i]+r[i]\)的最值就ok了

\(code\)

P3501 [POI2010]ANT-Antisymmetry

SP15569 STC02 - Antisymmetry

还是在manachar的板子上进行修改。

观察题面,无非就是要求我们求异或意义下的回文串

因为题面的意思是要求我们1与0相对,而不是1与1相对,在函数里循环的时候两个两个的枚举防止#与#判等的情况,相对关系用一个to数组存就好了。

在一个长度为\(L\)的异或回文串里共有\(\frac L2\)个异或回文串,直接加起来就好了。

\(code\)

P2601 [ZJOI2009]对称的正方形

正解和暴力都想了挺长时间,尤其是暴力\(code\)

用了离散化,regster int,inline来优化。

对于正解,就是对于整个方块横着竖着各扫一边,统计出横纵最长回文串的长度,在运算的时候可以用单调队列优化。

\(code\)

后缀数组&manachar总结的更多相关文章

  1. 后缀数组的倍增算法(Prefix Doubling)

    后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...

  2. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  3. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  4. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  5. POJ1743 Musical Theme [后缀数组]

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 27539   Accepted: 9290 De ...

  6. 后缀数组(suffix array)详解

    写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...

  7. 【UOJ #35】后缀排序 后缀数组模板

    http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...

  8. 【BZOJ-2119】股市的预测 后缀数组

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 334  Solved: 154[Submit][Status][Discuss ...

  9. 【BZOJ-4698】Sandy的卡片 后缀数组

    4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 140  Solved: 55[Submit][Stat ...

随机推荐

  1. 对标印度的PostMan,一款中国接口测试软件的崛起

    对于我们开发者,Api接口调试一定不陌生.包括我在内,之前进行Api调试时,一直使用的是一款印度的软件Postman.记得刚入手的时候,由于该款软件缺乏中文版本,上手一直比较慢,而且还至少存在如下几个 ...

  2. Redis数据结构—整数集合与压缩列表

    目录 Redis数据结构-整数集合与压缩列表 整数集合的实现 整数集合的升级 整数集合不支持降级 压缩列表的构成 压缩列表节点的构成 小结 Redis数据结构-整数集合与压缩列表 大家好,我是白泽.今 ...

  3. MySQL redo与undo日志解析

    前言: 前面文章讲述了 MySQL 系统中常见的几种日志,其实还有事务相关日志 redo log 和 undo log 没有介绍.相对于其他几种日志而言, redo log 和 undo log 是更 ...

  4. LightningChart JS 3.0 新功能上线

    在这次的LC JS更新中,首次将极坐标图引入图表库. 这种全新的图表类型可以通过API轻松地进行样式设置.极坐标可以用作独立图表或在仪表板中使用. 另外,用于 XY图表的对数轴也添加到了这次的更新,L ...

  5. Gateway导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  6. [c++] 内存与变量

    内存 程序代码区用来保存指令,常量区.全局数据区.堆.栈都用来保存数据 常量区和全局数据区有时也被合称为静态数据区,意思是这段内存专门用来保存数据,在程序运行期间一直存在 函数被调用时,会将参数.局部 ...

  7. 《我常用的股票投资工具与网站》v2.0

    <我常用的股票投资工具与网站>v2.0 王大海 职业投资,抽空做一点分享. 661 人赞同了该文章 "少年你好,想不到你竟有如此因缘际会看到这里.我看你骨骼精奇,定是万中无一的交 ...

  8. Linux进阶之使用Oh-My-Zsh打造炫酷终端

    Oh My Zsh是基于zsh命令行的一个扩展工具集,提供了丰富的扩展功能.除了功能增强之外,还提供非常丰富的主题.使用Oh-My-Zsh打造酷炫Shell终端的步骤(Deepin系统): 原始终端: ...

  9. CentOS 6.5新增加硬盘挂载并实现开机自动挂载

    Centos7.x请参考:https://www.cnblogs.com/himismad/p/7851548.html 在内网主机Centos 6.5新增一个50G硬盘 (搭建在CAS服务器,直接新 ...

  10. redis的rehash过程

    在扩容和收缩的时候,如果哈希字典中有很多元素,一次性将这些键全部rehash到ht[1]的话,可能会导致服务器在一段时间内停止服务.所以,采用渐进式rehash的方式,详细步骤如下: 为ht[1]分配 ...