题目简述:给定$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. 《UNIX-Shell编程24学时教程》读书笔记Chap3,4 文件,目录操作

    Chap3 文件操作   P28 在这章中,要着重记住一些常用的选项,要有使用正则表达式的思维,能更快达到目的.----@im天行 3.1 列文件名 .profile  sh的初始化脚本: .kshr ...

  2. Audio原理图设计

    1.DMIC 1)当双MIC时,通过MIC上的Selection PIN脚PULL  U/D进行左右channel选择.

  3. WPF03(样式)

    说起样式,大家第一反应肯定是css,好的,先上一段代码. 1 html{border:0;} 2 ul,form{margin:0; padding:0} 3 body,div,th,td,li,dd ...

  4. bash 的环境配置文件

    http://www.cnblogs.com/ggjucheng/archive/2012/11/01/2750179.html bash 的环境配置文件 你是否会觉得奇怪,怎么我们什么动作都没有进行 ...

  5. 【转】git在公司内部的使用实践

    版本定义: 版本号使用x.x.x进行定义,第一个x代表大版本只有在项目有重大变更时更新 第二个x代表常规版本有新需求会更新第三个x代表紧急BUG修正一个常见的版本号类似于:0.11.10 分支定义: ...

  6. 使用UIWebView载入本地或远程server上的网页

    大家都知道,使用UIWebView载入本地或远程server上的网页,sdk提供了三个载入接口: - (void)loadRequest:(NSURLRequest *)request; - (voi ...

  7. JQGrid总记录数和查询消耗时间不显示

    其他做的几个页面都显示,只有一个不显示....百度发现, viewrecords选项未配置,应该设置为ture才可以.

  8. live555 RTSP推送到Darwin出现404错误的解决

    我们将Darwin部署到公网,接收live555 RTSP/RTP推送的时候,经常会出现在SETUP步骤Darwin返回404错误,经过查找原因,主要是Darwin对live555推送的sdp信息中的 ...

  9. Write Custom Java to Create LZO Files

    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LZO LanguageManual LZO     Skip to e ...

  10. Hadoop集群搭建-Hadoop2.8.0安装(三)

    一.准备安装介质 a).hadoop-2.8.0.tar b).jdk-7u71-linux-x64.tar 二.节点部署图 三.安装步骤 环境介绍: 主服务器ip:192.168.80.128(ma ...