其实是个套路题(?
首先,LCP 这种东西,不能直接求就优先考虑二分答案。
设二分出来的东西为 mid,那么就是相当于在整个字符串里,至少有一个以 s 为起点的后缀,使得
- s∈[a,b−mid+1];
- 该后缀与以 c 为起点的后缀的 LCP 长度不小于 mid。
注意到一个端点固定,另一个端点朝一方变化的区间最小值函数是单调的。
也即满足第二个条件的 s 应当属于后缀排名上包含 c 的一个区间。
这个可以二分出来。
然后用主席树维护一下二维偏序就 OK 了。
代码:
1 |
|
其实是个套路题(?
首先,LCP 这种东西,不能直接求就优先考虑二分答案。
设二分出来的东西为 mid,那么就是相当于在整个字符串里,至少有一个以 s 为起点的后缀,使得
注意到一个端点固定,另一个端点朝一方变化的区间最小值函数是单调的。
也即满足第二个条件的 s 应当属于后缀排名上包含 c 的一个区间。
这个可以二分出来。
然后用主席树维护一下二维偏序就 OK 了。
代码:
1 | #include <cstdio> |