cdq分治学习笔记

cdq分治也是咕了好久了..最近总算把它学了。

cdq分治是一种离线算法,可以代替一些复杂的数据结构,降低代码难度,减小常数。废话大家都知道。

BZOJ4003 [JLOI2015]城池攻占(左偏树)

题目链接

洛谷

darkbzoj

题意简述

给你一棵树,每个节点有 $h$ 值,一个勇士来到一个节点时如果他的战斗力大于等于 $h$ 就能占领城池并前往这个节点的父亲(除非已经到了根节点),否则阵亡;攻占一个节点后,勇士的战斗力会加/减/乘一个正整数(根据节点而定);每个勇士有初始战斗力和想占领的第一个节点。问,每个节点各有多少个勇士阵亡,每个勇士各占领了几个节点。

CF235C Cyclical Quest(SAM)

题目链接

洛谷

CF problemset

CF contest

题意简述

给你一个字符串 $s$ 和 $n$ 个字符串 $x_{1..n}$,对每个 $x_i$,求有多少个 $s$ 的子串可以由 $x_i$ 旋转得到。

旋转一个字符串就是把它的一个前缀移到后面,如 abcd 可以旋转得到的字符串有 abcdbcdacdabdabc

后缀自动机(SAM)学习笔记

后缀自动机是一种处理字符串问题的有力工具(废话),它的码量不比后缀数组大(实际代码难度不比后缀数组小,但也不难),处理问题时的思维难度往往比后缀数组小,复杂度更优秀。若字符集大小为 $|\Sigma|$,则:构建时间复杂度 $O(n|\Sigma|)$,转移时间复杂度 $O(1)$,空间复杂度 $O(n|\Sigma|)$ 或 构建时间复杂度 $O(n\log|\Sigma|)$,转移时间复杂度 $O(\log|\Sigma|)$,空间复杂度 $O(n)$。