csp-s模拟47
T1:
考虑每个黑条的限制范围其实是一个区间,于是把脚长的限制计算在里面后去掉
而每次只能走k,所以可以在模k意义下进行线段覆盖
若全覆盖则无解,否则有解。
(注意若某一个黑条第限制区间大于k,则一定无解)
(还要注意若一个黑条跨越了模k的序列,则需要拆成两个)
T2:
暴力线段树合并就完了
T3:
kmp处理出原串的t集合
考虑实际上问题就是:构造一个字典序最小的01串使其与原串的nxt数组某些位置相同
考虑当满足第i个限制后如何满足第i+1个限制
设\(delta=len_{i+1}-len_i\)
若\(delta<len_i\),则为满足nxt的限制,直接复制delta长度的后缀接在后面即可
若\(delta>=len_i\),则复制该串放在最后,中间补0即可。
但这时可能会不满足条件,所以当新串的kmp跑到\(len_{i+1}\)时需要判断一下,若不满足限制,则将中间补的0的最后一位i改为1即可。