题目简述:给定$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] \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)$,分别称为$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][i]$表示:长度为$n$且满足$\delta(q_0, s[1\dots i]) = q$的那些数字串$s$中,$d$部分在$s[1\dots i]$内的$s$的【好】子串的最大个数。则

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

其中$p \to 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 \text{pre}(q) \land m_i \leq L], $$

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

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

CodeForces 1110H. Modest Substrings的更多相关文章

  1. codeforces #271D Good Substrings

    原题链接:http://codeforces.com/problemset/problem/271/D 题目原文: D. Good Substrings time limit per test 2 s ...

  2. Codeforces 316G3 Good Substrings 字符串 SAM

    原文链接http://www.cnblogs.com/zhouzhendong/p/9010851.html 题目传送门 - Codeforces 316G3 题意 给定一个母串$s$,问母串$s$有 ...

  3. [CF1110H]Modest Substrings

    description CodeForces 定义一个正整数\(x\)是合适的当且仅当\(l\le x\le r\),其中\(l,r\le 10^{800}\). 找到一个长度为\(n\)的数字串,使 ...

  4. CodeForces 550A Two Substrings(模拟)

    [题目链接]click here~~  [题目大意]:  You are given string s. Your task is to determine if the given string s ...

  5. Codeforces 271D - Good Substrings [字典树]

    传送门 D. Good Substrings time limit per test 2 seconds memory limit per test 512 megabytes input stand ...

  6. Codeforces 1276F - Asterisk Substrings(SAM+线段树合并+虚树)

    Codeforces 题面传送门 & 洛谷题面传送门 SAM hot tea %%%%%%% 首先我们显然可以将所有能够得到的字符串分成六类:\(\varnothing,\text{*},s, ...

  7. CF1110H Modest Substrings AC自动机、DP

    传送门 如果\(r-l\)比较小,可以将所有满足条件的串扔进\(AC\)自动机然后在上面DP,从前往后确定字符串的每一位. 但是\(l,r \leq 10^{800}\)就十分不可行,所以需要优化这个 ...

  8. Codeforces.392E.Deleting Substrings(区间DP)

    题目链接 \(Description\) \(Solution\) 合法的子序列只有三种情况:递增,递减,前半部分递增然后一直递减(下去了就不会再上去了)(当然还要都满足\(|a_{i+1}-a_i| ...

  9. @codeforces - 1276F@ Asterisk Substrings

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个包含 n 个小写字母的字符串 s,用 s 生成 n 个串 ...

随机推荐

  1. ubuntu环境准备

    一. 桌面方面看起来比较不爽,12的版本用起更不习惯,决定改成命令行登陆 a. vi  /ect/default/grub 文件 b. 修改成第二个红框的情况 c. 执行update-grub命令 d ...

  2. python(11)- 文件处理

    文件操作 1.1 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧明 ...

  3. Java面向对象基础三

    1.函数的重载 2.构造函数的作用 (构造函数能够重载) 1.函数名必须和类名同样 2.没有返回值 3.使用 New 来调用构造函数 4.假设类中没有构造函数,编译器会自己主动帮忙载入一个參数为空.方 ...

  4. VS快速生成JSON数据类

    1.复制Json数据 2.

  5. Django-models-m2m

    在Django的orm中,如果有多对多的字段,那么他的第三张表时自己生成的,参考官方文档发现第三张表可以自己写↓: 而且第三张表好像是可以自定制的 from django.db import mode ...

  6. 改动UITextfield的Placeholder字体的颜色

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  7. centos6.4中文输入法安装和切换(转载)

    1.用root登录,或者切换到root账户(su root): 2.yum install "@Chinese Support"; 3.exit: 4.System→prefere ...

  8. gitlab 外网 无法访问 查端口 看文档

    云服务器安装成功后 curl   页面可以正常跳转 重置密码的token  页面可以生成 但是  外网无法 访问 [root@test ~]# curl 127.0.0.1:18021 <htm ...

  9. Cocos2d-x动画播放(序列帧)

    简介 Cocos2d-x中,动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果.动画由帧组成,每一帧都是一个纹理,我们 ...

  10. dhcpcd守护进程分析【转】

    本文转载自;http://blog.csdn.net/lishanmin11/article/details/37930073 最近在调android ethernet功能,android本身不带 e ...