与right集合有关的套路
套路仍然是考虑pnt树,找每个节点的right结合,用线段树合并来维护出现位置,然后就可以进行dp和查询
把经典的套路弄熟!
1. 分拆字符串,删除一个字符,对本质不同的串的影响**
7月集训的时侯用来互测的超繁的题
这是简化版,相同的还有bc一道题,不挂出来了
2. 利用出现位置的性质**
CF700E Cool Slogans
这道题利用的性质是:只要pnt在儿子的一个出现位置中出现两次以上和在儿子的right集合(所有位置)出现两次以上等价,所以查询就只需要查任一位置
从上往下dp即可
这是道好题,应该写一下
NOI 2018 你的名字
题意
求T在S的[pl,pr]未出现过的本质不同的子串个数
题解
对S和T都是子串相关,那么就都建后缀自动机。其实一个Trie树后缀自动机就搞定了,只是常数或大一些
既然是S的区间,那么就要在pnt树上线段树合并维护right集合
然后用T和S匹配,查询到当前的匹配长度,标记这段不合法。
最后在T的后缀自动机上统计一下标记即可求出答案
总结:
模板代码的使用。把细节想清楚。
特别是修改代码之后,不能草率。一定要想清楚。这题因为修改没有想清楚,浪费了15min!
本来计划30min,结果多调了50min,非常不应该!
前面的调试脑袋清醒,后面只剩两个点没有通过就非常浮躁。其实是有严重的正确性问题!
没有考虑到在同一个节点缩短长度就可以和S匹配的情况。线段树上要查询right集合最靠右的位置
code
P4022 [CTSC2012]熟悉的文章
题解
二分答案
写出DP方程,单调队列维护
唯一就是感觉需要两个单调队列,为什么大家的题解都只用一个,难道读错题了?
还没有来得及写
P4094 [HEOI2016/TJOI2016]字符串
询问s[a…b]的所有子串和s[c…d]的最长公共前缀的最大值
题解
这题可以练后缀数组基本功
Labelray’s Blog
主要是要想到二分答案,sam也可以查但是麻烦一点。
CF235C Cyclical Quest
给一个主串和多个询问串,求询问串的所有样子不同的周期同构出现次数和
题解
直接匹配,这个可以倍长,也可以在前面删字符(跳pnt即可),
关于去重
kmp求循环节,如果不能整除环长肯定不会有相同的,否则除一下即可。(我竟然想了好久不会,QWQ)
或者直接在sam上打个标记,显然更好写