浅谈分治解决 0/1/? 匹配

· · 算法·理论

1. 静态离线

问题描述

给定 N 个精确 0/1 模式串,回答 Q 个包含 0/1/? 的查询串,位宽均为 K。求与每个查询串匹配的模式串权值和。

查询串的字符集只有 ?、0、1 三类,位权总和恒为 K。

用 SOS DP 处理以下数组:

查询分类

设查询串的固定 1 集合为 M_1,固定 0 集合为 M_0,通配集合为 M_?,U = \overline{M_0}。匹配条件为 M_1 \subseteq x \subseteq U。

  1. cnt(?) \le K/3:\text{Ans} = \sum_{s \subseteq M_?} b[M_1 \mid s]
  2. cnt(0) \le K/3(对 0 容斥,查超集):\text{Ans} = \sum_{T \subseteq M_0} (-1)^{|T|} S_{\text{sup}}[M_1 \mid T]
  3. cnt(1) \le K/3(对 1 容斥,查子集):\text{Ans} = \sum_{T \subseteq M_1} (-1)^{|T|} S_{\text{sub}}[U \setminus T]

2. 动态在线

不可离线做全局 SOS DP,采用阈值 B = K/2 进行分治。

策略

(1) 插入按点权大小 |z| 分类

(2) 查询按自由位 |W| 分类

实际上有 O(N(\frac{4}{3})^{K}) 的做法,个人认为本做法更加简单直观且卡常后也可通过例题。

3. 例题

  1. 毒蛇越狱
  2. Triples