zoukankan      html  css  js  c++  java
  • CodeForces 1110H. Modest Substrings

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

    $$ arg max_{s in Sigma^n} sum_{i=1}^n sum_{j=i}^n [s[i] eq 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$,使得

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

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

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

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

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

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

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

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

    我们可以把$L = d Sigma^m$这类特殊的正规语言简记为$(d, 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 imes Q o Q$。

    Step 3:动态规划

    设$f[q][i]$表示:长度为$n$且满足$delta(q_0, s[1dots i]) = q$的那些数字串$s$中,$d$部分在$s[1dots i]$内的$s$的【好】子串的最大个数。则

    $$ f[q][i] = max_{p o q} { f[p][i-1] }+g[q][n-i], $$

    其中$p o q$表示存在$a in Sigma$使得$delta(p, a) = q$,$g[q][L]$表示$d$部分恰好在$q$处结束且$m$部分长度不超过$L$的正规语言个数,即

    $$ g[q][L] = sum_{i=1}^k [d_i in ext{pre}(q) land m_i leq L], $$

    其中$ ext{pre}(q) = { q, ext{link}(q), ext{link}( ext{link}(q)), dots, q_0 }$表示$q$在失败树上的所有祖先,而$ ext{link}(q)$表示$q$在AC自动机中的失败指针。

    于是时间复杂度为$O(|Sigma|^2 n(log l+log r))$,通过一些小优化可将时间复杂度降为$O(|Sigma| n (log l+log r))$。

  • 相关阅读:
    eval函数欺负我
    JS Compress and Decompress
    PowerDesigner 把Comment写到name中 和把name写到Comment中 pd7以后版本可用
    vue + axios 通过Blob 转换excel文件流 下载乱码问题
    poj 3687Labeling Balls
    poj 2485Highways
    poj 1258AgriNet
    poj 3041Asteroids
    poj 1035Spell checker
    poj 3020Antenna Placement
  • 原文地址:https://www.cnblogs.com/TinyWong/p/10394579.html
Copyright © 2011-2022 走看看