「考试」省选12

状态不好考的不行(x
还是在家里不够专注吧(?

T1
一个简单的离散化+bfs
细节不少
一个区间直接把两个端点都离散进去就行了。
统计答案的时候按块统计答案。

T2
减枝的搜索。
不是特别难。
发现其实格子并不是很多。
\(K\)给限制住了。
太多的都是0.
那么\(n+m-1\)的大小必然是小于等于10的。
直接爆搜。
剪枝要用到一个小技巧。
当前如果许多个颜色并没有放过,那么我放上一种颜色搜索一下得到答案,那么这几个颜色是等价的可以直接不重复搜索,然后将答案乘上个数。

T3
挺厉害的\(SAM\)实在调不出来了不过。
可以先假设当前给出的树是\(Trie\)
我对这个Trie建出exsam。
然后对于每一个前缀节点做出如下操作:
找到他对应的Trie节点x
设其子树区间为:\([L[x],R[x]]\)也就是\(dfs\)序。
然后对这个前缀节点的线段树做如下操作:

\[++d[L[x]],--d[R[x]+1] \]

然后在后缀树上线段树合并。
这样相当于做了个树上差分。
相当于这个节点的每个子孙节点都+1了。
对应节点来说,就是每个祖先都在他身上累加了。
然后对于一个匹配串。
我可以找到在Trie上两个点之间的路径。
首先求出lca,然后lca附近的部分均用hash处理。
剩下的就是一个点到根的路径上匹配串出现的次数。
这个东西直接在exsam上正反匹配匹配串,最终得到的节点设为x,当前查询的节点为\(t\),那么在x的线段树上查询\(dfn[t]\)处的前缀和即可得到这个点到根路径上匹配串出现的次数。
然后就没了,然后我写死了200多行调了好几个小时各种对拍都拍不出来我就不想写了。

posted @ 2020-01-29 18:59  Lrefrain  阅读(88)  评论(0编辑  收藏  举报