回文自动机做题小结

摘要:
模板计算每个位置结束的回文字符串的数量。加密的输入是回文自动机节点的(len)数组,对应于最长的回文后缀。双回文形状如下:(AA^rAA^r,它表示长度不超过(frac{len}{2})的后缀回文字符串,如果(len[tran[

模板

求以每个位置结尾的回文串的数量,加密输入

就是回文自动机节点的(len)数组,对应的是最长回文后缀

双倍回文

求形如(AA^rAA^r)

方法一:建立(fail)树,然后对每个(len)是偶数的点,在子树内找有没有长度为(2*len)的点,通过打标记做到(O(n))

方法二:求一个与(fail)数组对应的(tran)数组,含义为长度不超过(frac{len}{2})的后缀回文串,如果(len[tran[x]]*2==len[x])说明该点可以选择

求法就是当(len[x]le 2)的时候(tran[x]=fail[x]),否则从父节点的(tran)开始沿着(fail)往上跳,直到找到能选且长度小于(frac{len}{2})的节点

回文串

求最大回文串的长度和出现的次数

长度不用说,考虑因为树上(fail)连接都是最大回文后缀,所以每个节点代表的回文串在原串中出现的次数就是(fail)树中子树的权值和

[CERC2014]Virus synthesis

每次可以加一个字符或加一个反串,求得到(s)的最少操作次数

按照双倍回文的套路求出(trean),设(dp[x])是得到(x)点的最小操作次数,初始为(len[x])

[dp[x]=min{dp[fa]+1,dp[tran[x]]+1+frac{len[x]}{2}-len[tran[x]]} ]

注意的是只在(0)的回文子树里操作,因为奇根子树里的回文串根本没法通过加反串得到

秩序魔咒

求在两个字符串里都出现的最长回文串和长度和数量

建两个回文树一起跑就行了

快乐的JYY

求两个字符串中,(A)属于第一个串,(B)属于第二个串,(A=B)且是回文子串的对数

对两个回文树分别求出节点出现次数,然后一起跑,每个节点贡献乘起来

要有光

题目贼长但是蛮有意思的题

给定一个字符串,求通过操作变成某个子串的最小代价

操作一:把(S)变成(S)的最大回文后缀

操作二:把(S)变为(T)使得(S)(T)的最大回文后缀,(T)是原串的子串(操作一的逆操作)

操作三:把一个回文串删除长度不超过(min(k,frac{len}{2}))的前缀和后缀

操作四:把一个回文串变成一个更长的回文串,变化后的回文串是原串的子串(操作三的逆操作)

操作五:在(S)前面加一个字符,使用后不能再用前四个操作

代价分别是(A,B,C,D,E)

挨个操作分析:

操作一:连边((i,fail[i],A))

操作二:连边((fail[i],i,B))

操作三:向自己回文树上的(1-k)级祖先连边,权值(C)

操作四:直接向自己子树连边边数就(O(n^2))了,考虑建立一个与原树对应的回文树,只能向子节点走,边权都是(0),然后再连边((i,i^{'},D),(i^{'},i,0))

(dij)求最短路(初始节点是最后的(pre)

设此时(dp[x])表示变化到(x)节点需要的最小代价

[dp[x]=min{dis[x],dp[fail[x]]+E*(len[x]-len[fail[x]])} ]

然后对于每个询问,在(fail)树上找到它最长回文后缀代表的节点,可以倍增实现,答案就是

[dp[pos]+E*(r-l+1-len[pos]) ]

但是如果原串本身不是回文串,在跑(dij)的时候默认从原串的最大后缀回文开始跑的,还要再加一个(A)

免责声明:文章转载自《回文自动机做题小结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇小程序 大转盘 抽奖 canvas animationFlash Media Server 4.5入门——第六部分:初学者HTTP动态流(HDS)技术向导【转】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

snprintf()函数使用方法

众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf. 自从snprintf代替了sprintf,相信大家对snprintf的使用都不会少,函数定义如下: int snprintf(char*str, size_t size,constchar*format, ...); 函数说明: 最多从源串中拷贝s...

使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)

正常情况下使用md5加密 var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.createHash('md5').update(data).digest('hex'); return md5; } 实际开发中经常需要前端nodej...

【字符串入门专题1】C

Problem Description Generally speaking, there are a lot of problems about strings processing. Now you encounter another such problem. If you get two strings, such as “asdf” and...

PHP 字符串长度计算函数strlen() 正确的计算 中文汉字长度的方法 与mb_strlen()应用

也许很多phper不知道,PHP内置的字符串长度函数strlen()无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)。 所以当需要计算字符串中汉字的个数,或者一个字符串的长度,就不是简单的用strl...

VUE 或者JS 常用数据类型及方法:字符串、数组、对象

字符串 1. 字符串转换  2. 字符串分割  3. 字符串替换  4. 获取字符串长度 var mystr="qingchenghuwoguoxiansheng,woaishenghuo,woaiziji"; var arrLength=mystr.length; 5. 字符串切割 有三种可以从字符串中抽取和切割的方法: 第一种,slice()函...

BZOJ 3098: Hash Killer II(新生必做的水题)

3098: Hash Killer II Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1555  Solved: 819[Submit][Status][Discuss] Description 这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题: 给...