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一样了。