CodeForces 1110H. Modest Substrings

题目简述:给定$1 \leq l \leq r \leq 10^{800}$,求一个长度为$n \leq 2000$的数字串$s$,其含有最多的子串$s[x \dots y]$,将其看做数字时无前导零且满足$l \leq s[x \dots y] \leq r$。形式化的说,就是求

$$ \arg \max_{s \in \Sigma^n} \sum_{i=1}^n \sum_{j=i}^n [s[i] \neq 0 \land l \leq s[i \dots j] \leq r] , $$

其中$\Sigma = \{0,1,2,\dots, 9\}$。

解:code

Step 1. 用一类特殊的 正规/正则 语言(Regular Language)描述$l \leq x \leq r$

我们选择一类特殊的正规语言,其形如 $ L = d \Sigma^m $,其中$d \in \Sigma^+, m \in \mathbb{N}$。

观察:存在一组上述特殊的正规语言$L_1, L_2, \dots, L_k$,使得

$$ \bigcup_{i=1}^k L_i = \mathbb{N} \cap [l, r] $$

且$k = O(|\Sigma|(\log l+\log r))$。

这个结论我们不加证明,但给出两个例子以说明。

Example 1. $l = 12, r = 1234$。我们可取:

$$
\begin{aligned}
& 12, 13, 14, 15, 16, 17, 18, 19, \\
& 2\Sigma^1, 3\Sigma^1, \dots, 9\Sigma^1, \\
& 1\Sigma^2, 2\Sigma^2, \dots, 9\Sigma^2, \\
& 10\Sigma^2, 11\Sigma^2, \\
& 120\Sigma^1, 121\Sigma^1, 122\Sigma^1, \\
& 1230, 1231, 1232, 1233, 1234.
\end{aligned}
$$

Example 2. $l = 1234, r = 1456$。我们可取:

$$
\begin{aligned}
& 1234, 1235, 1236, 1237, 1238, 1239, \\
& 124\Sigma^1, 125\Sigma^1, \dots, 129\Sigma^1, \\
& 13\Sigma^2, \\
& 140\Sigma^1, 141\Sigma^1, 142\Sigma^1, 143\Sigma^1, 144\Sigma^1, \\
& 1450, 1451, 1452, 1453, 1454, 1455, 1456.
\end{aligned}
$$

Step 2:构建一组特殊正规语言的 AC自动机(Aho-Corasick  Automaton)

我们可以把$L = d \Sigma^m$这类特殊的正规语言简记为$(d, m)$。对于$L_1, L_2, \dots, L_k$,其中$L_i = (d_i, m_i)$,我们构建包含单词$d_1, d_2, \dots, d_k$的AC自动机。值得一提的是,由于$L_i$的构造的局部特征,AC自动机的状态数是$O(|\Sigma|(\log l+\log r))$的。

注:AC自动机也是一类(确定)有限状态自动机((Deterministic) Finite-State Automaton),因此其也可描述成一个有限状态自动机,其状态集为$Q$,初始状态为$q_0 \in Q$,转移函数为$\delta: \Sigma \times Q \to Q$。

Step 3:动态规划

设$f[q][L]$表示:长度为$n$且满足$\delta(q_0, s[1\dots L]) = q$的那些数字串$s$中,

猜你喜欢

转载自www.cnblogs.com/TinyWong/p/10394579.html