A. Colorado Potato Beetle
暴力做法是直接bfs。
优化的方法是离散化。
将特殊的点的横纵坐标抽出来,然后用这些横纵坐标为1e12*1e12分成一个个块,容易发现每个块内的状态是一致的。
然后用与暴力类似的方法即可,注意最后统计的是每个块的实际大小。
B. Distinct Paths
观察可知数据范围欺骗了你。
似乎剪枝(注意去重复状态)的搜索就能过。
一个更合理的做法是因为行是单调不降的,状压每个颜色的最早出现的列就好了。
但是还是需要一些玄学剪枝。
C. 回忆树
容易发现问题可以转化为三部分累计答案。
u->lca,跨过lca,lca->v。
其中跨过lca的贡献比较容易维护,因为询问串总数不大,只要将跨过lca的串提出来,单独用kmp统计即可。
考虑如何维护lca->v,把询问串放到sam上跑,我们关心的是lca->v这条链上(要扣掉最上面一部分)的endpos集合大小。
显然使用广义后缀自动机就好了。
因为关注一条链上的endpos集合大小,使用线段树合并。
但是一条链上的区间不是连续的,所以使用重链剖分。(也可以用另一种方法直接树上前缀和)
还有一个问题是u->lca,这里直接用广义后缀自动机不行了。
但是显然将询问串翻转一下,问题就和lca->v一样了。