关于 字符串 的一些认识
先说明一点:我字符串学得不好...
\(CSP\) 之前貌似只有 哈希,KMP,Manacher 会有用
AC 自动机建议 \(CSP\) 前有所了解,省选前一定要学透彻
\(CSP\) 后强烈建议学好 SA 和 SAM ,讲课要找一个靠谱的人讲(__wfx 讲的我很长一段时间都怀疑人生)
PAM 可以看情况学。
哈希
挺神奇的一种思路,把字符串的判定相同由 \(O(n)\) 变成了 \(O(1)\),往set/vector等容器里存的时候空间也小了很多。
然而字符串问题中有很多是匹配问题,所以哈希用途很广。
一段区间的hash可以通过O(n)预处理后O(1)求.
hash放到树上也可以O(n)预处理后O(1)求.
KMP
匹配字符串的利器,时间复杂度也很优秀
Manacher
求回文的利器,知道回文半径后很多回文字符串题都变得很简单。
和PAM的一个区别:Manacher 需要离线,PAM可以在线。
AC 自动机
和 KMP 有相似之处,只不过AC自动机可以用来解决多串匹配问题
SA
求出 heigth 数组后能干好多东西。空间还小,建议学会 \(O(nlogn)\) 的求法,\(O(n)\) 的求法没太大必要学
SAM
解决字符串问题的大杀器,注意字符集的大小会影响时间复杂度和空间复杂度。
如果出题人很毒瘤的话,一些问题只能用SA来解决(虽然SA能解决的SAM也能解决)