肝了不知道多久的串串,终于把这个东西学明白了

先挂上大佬的博客:https://www.cnblogs.com/Parsnip/p/12426971.html

这个东西简称我也不知道叫什么,只知道在某些方面真的比较好用

先得知道一系列的前置知识,建议去阅读论文:金策_字符串算法选讲

前置知识是:弱周期定理、字符串Border、Border Series和一个很重要的结论:一个回文串的所有回文后缀可以表示为 O(logn) 段等差数列

然后就可以去做一些奇奇怪怪的优化了,比如对于某个前缀 s[ i ] 来说,需要枚举其所有回文后缀的贡献,如果暴跳fail树的话,会被“aaaa....aaa”这种字符串卡成 O( n ) 级别的,而如果套用上面的理论,则可以将所有的回文后缀视为 logn 段等差数列,因为每段等差数列结束的位置以及前一次结束的位置都相同,所以可以一起维护,时间复杂度下降到了 O( logn )

Border Series最经典的应用就是回文串划分的 dp,其实现也非常的简单,只需要在 PAM 中增加一个函数用于代替暴跳fail树即可

这里用的是葫芦爷的转移代码,相信会PAM的同学肯定不陌生吧,就不多bb了

符号约定:

  1. len[ i ] 表示节点代表的回文串长度
  2. fail[ i ] 表示节点的失配指针,即最长的回文后缀,即最大border。
  3. diff[ i ] = len[ i ] − len[ fail[ i ] ] ,表示一个节点和他最大border长度的差,即所在的等差数列的公差。
  4. anc[ i ] 表示节点所在等差数列的首项位置,即从 i 开始往根走,保证 diff 值都相同,最终走到的点。
  5. g[ i ] 维护每个点到链顶的信息,维护的范围是( len[ anc[ i ] ] , len[ i ] ],公差 d = diff[ i ]。
  6. f[ i ] 表示DP值,即将串 S[ 1 , i ] 进行分割的方案数。

题目的话后续会慢慢补上的,个人喜好,不喜欢在同一篇博客中写多个题目

void trans(int i)
{for(int j=last;j>1;j=anc[j]){g[j]=f[i-len[anc[j]]-diff[j]];if(diff[j]==diff[fail[j]])g[j]=(g[j]+g[fail[j]])%mod;f[i]=(f[i]+(i%2==0)*g[j])%mod;}
}

字符串科技:Palindrome Series相关推荐

  1. CodeForces - 906E Reverses(回文自动机+Palindrome Series优化dp)

    题目链接:点击查看 题目大意:给出两个字符串 s 和 t,每次可以在字符串 s 中选择数个不相交的字串进行反转,问最少需要反转多少次,可以使得字符串 s 和 t 相等,输出最小反转次数以及方案 题目分 ...

  2. 2019ICPC(沈阳) (回文自动机+Palindrome Series优化dp)

    无从追溯的一道题目.. 题目大意:给出一个字符串 s,要求在 s 中选出3个互不相交的回文子串,求长度之和的最大值 题目分析:考虑 n * n 的 dp,dp[ i ][ k ] 为 s[ 1 : i ...

  3. CodeForces - 932G Palindrome Partition(回文自动机+Palindrome Series优化dp)

    题目链接:点击查看 题目大意:给出一个长度为偶数的字符串,问将其分割成 k 个子串记为 a[ 1 ] , a[ 2 ] ... a[ k ] ,且满足 a[ i ] == a[ k - i + 1 ] ...

  4. SPOJ - IITKWPCE Let us play with strings(回文自动机+Palindrome Series优化dp)

    题目链接:点击查看 题目大意:给出一个长度为 n 的字符串,问最少拆分成多少个连续的子串,使得每个子串都是一个回文串 题目分析:dp[ i ] 代表 s[ 1 : i ] 的前缀最少可以拆分成多少个连 ...

  5. CodeForces - 17E Palisection(回文自动机/Palindrome Series优化dp)

    题目链接:点击查看 题目大意:给出一个长度为 n 的字符串,问有多少 相交的回文子串对数 题目分析:背 PAM 模板的时候突然发现了一道模板题,于是顺手写了..正难则反,可以先求出有多少个互不相交的回 ...

  6. 【Python基础】Pandas向量化字符串操作

    一.向量化操作概述 Python内置一系列强大的字符串处理方法,但这些方法只能处理单个字符串,处理一个序列的字符串时,需要用到循环. 那么,有没有办法,不用循环就能同时处理多个字符串呢,pandas的 ...

  7. python格式化字符串_阿博的Python之路详解String数据类型

    这是阿博的第16篇文章 之前分享了Python的Number数据类型,今天给大家详细讲一下我学习到Python的String数据类型.在日常开发当中String类型应该是我们最常使用到的数据类型,那么 ...

  8. 04_pandas字符串函数;数据合并concat、merge;分组groupby;Reshaping;Pivot tables;时间处理(date_range、tz_localize等)

    字符串函数,Series的lower()函数 Series在str属性中提供了一组字符串处理方法,可以方便地对数组中的每个元素进行操作,如下面的代码片段所示.请注意,str中的模式匹配通常默认使用正则 ...

  9. 数据科学 IPython 笔记本 7.13 向量化字符串操作

    7.13 向量化字符串操作 原文:Vectorized String Operations 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Pyth ...

最新文章

  1. 开始——“运行”命令集
  2. 数字图像处理基本运算
  3. audino python_用 Python 实现 PowerDesigner 数据模型文件的处理
  4. LeetCode 371. 两整数之和(位运算加法)
  5. libevent for android
  6. jmeter jdbc mysql_jmeter获取JDBC响应做接口关联(三)
  7. filebeat 笔记
  8. 欧姆定律基本知识(笔记)
  9. 肉袒牵羊的拼音及解释
  10. XWiki 6.3 M1 发布,Java 的 Wiki 系统
  11. tornado使用mysql 连接池(torndb)
  12. Struts2(一)之认识struts2
  13. 【VMCloud云平台】SCAP(二)
  14. 依照ILSVRC2012在matconvnet-1.0-beta23 中用imagenet训练的情况,训练自己的数据
  15. JSONObject遍历并替换部分json值
  16. 计算机视觉结合深度学习项目-智能停车场空车位实时识别
  17. win10系统 该文件没有与之关联的应用来执行该操作,请安装应用,若已经安装应用,请在“默认应用设计“页面中创建关联
  18. 山东大学数据库课程设计火车票系统报告
  19. 机器人领域主要国际会议与期刊列表
  20. DAL(Dynamic Anchor Learning for Arbitrary-Oriented Object Detection)

热门文章

  1. 实现歌词效果自动滚动_只需五步,专业Pr软件实现视频歌词渐变色效果,你学会了吗?...
  2. Elastic-Job任务类
  3. zookeeper的设计猜想-关于 2PC 提交
  4. 序列化技术的选型-选型建议
  5. MyBatis 缓存详解-二级缓存介绍
  6. MyBatis相应API
  7. InputStreamReader介绍代码实现
  8. FileFilter过滤器的原理和使用
  9. 登录案例_BeanUtils基本使用
  10. Request_原理