题目简述:给定$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))$。

转载于:https://www.cnblogs.com/TinyWong/p/10394579.html

CodeForces 1110H. Modest Substrings相关推荐

  1. codeforces D Good Substrings(hash)

    选择P和M,刚开始使用131和1000000009提交出错,换成1000000009和Long.MAX_VALUE提交成功.在处理出错字符个数不超过k时,在循环中统计出错字符个数提交超时,改成预处理, ...

  2. CodeForces - 1400F x-prime Substrings(AC自动机+dp)

    题目链接:点击查看 题目大意:给出一个只由数字 1 ~ 9 组成的字符串 s,首先规定 f( l , r ) 为字符串 s 的区间 [ l , r ] 中的数位和,再规定 x-prime 需要同时满足 ...

  3. 2019.4.30 WAGV CF Team replay

    前言 4月30号的2小时CF重现赛,基本都是DIV2的水题,目标是训练CF题目的题感来上分,主要是读英文题有困难,对题意理解困难- 比赛地址:https://cn.vjudge.net/contest ...

  4. Codeforces Round #548 (Div. 2) A. Even Substrings

    You are given a string ?=?1?2-??s=s1s2-sn of length ?n, which only contains digits 11, 22, ..., 99. ...

  5. codeforces 1029 A. Many Equal Substrings

    题意:给一个串t,构造一个尽可能长度小字符串,使得这个字符串里有k个子串t 只需要找出最大的前缀和后缀相等的情况即可,刚开始忘记了strstrstrstr的这种情况,用substr方便一点 #incl ...

  6. Codeforces Round #820 (Div. 3) G. Cut Substrings(kmp状态机dp)

    TP 题意: 给定两个字符串 s.t,问最少删除多少个 s 中出现的 t 串,使得 s 中不再存在任何 t 串.删除后的位置不拼接,而是变成 - 点 同时统计最少删除的方案数. 思路: 看到维护 最少 ...

  7. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  8. Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp

    C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...

  9. Codeforces Round #265 (Div. 1) C. Substitutes in Number dp

    题目链接: http://codeforces.com/contest/464/problem/C J. Substitutes in Number time limit per test 1 sec ...

最新文章

  1. 转载:Beginning WF 4.0翻译——第四章(传递参数)
  2. 最新曝光的iPhone大漏洞:传文件会泄露个人隐私,2年多了苹果知而不改
  3. Python 模块学习:os模块
  4. 国密算法椭圆曲线参数
  5. angular 点击事件阻止冒泡及默认行为
  6. 计算机教育的进制转换,计算机数制及编码进制转换公开课教学教育资料.doc
  7. Java是有法_Java基础语法
  8. 电脑时钟倒计时_倒计时久坐休息提醒工具
  9. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_1-1课程整体介绍...
  10. configserver配置中心三种配置方式
  11. 【VS2015】关于VS2015如何运行的问题
  12. 爬虫 - 股票爬虫实例之雪球网
  13. 每天5分钟玩转Kubernetes | Liveness探测
  14. 惊艳全网的裸眼3D巨屏,竟是一场视觉骗局?
  15. 在AI眼前“隐身”,用特制贴欺骗AI计算机视觉
  16. 基于Python+django的 医院排队叫号系统-计算机毕业设计
  17. Java自学全套视频(jse,jee,ssh,android,oracle,linux,html,js,jQuery等)下载地址
  18. 中国集成电路产业投资建议与十四五需求规模分析报告2022版
  19. 2019年3月全国计算机二级考试试题,(完整版)2019年全国计算机二级考试试题题库(附答案)...
  20. 【Visual C++】游戏开发五十 浅墨DirectX教程十八 雪花飞扬 实现唯美的粒子系统

热门文章

  1. 如何处理SAP云平台错误消息 there is no compute unit quota for subaccount
  2. php发送验证码短信,php发送短信验证码
  3. mysql main函数_关于main()函数的小技巧
  4. finalshell日志乱码问题_Tomcat乱码问题
  5. ai背景合成_AI设计制作万圣节夜景插画
  6. java对import语句_Java的import语句 - 不积跬步,无以至千里 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  7. 四因素三水平正交试验表_测试用例设计方法(二)——正交实验法
  8. java字符串装双精度_Java 将双精度值转换为字符串
  9. unity添加对象实例_【Unity】6.3 通过 C# 脚本创建和访问游戏对象
  10. 突然决定!自掏腰包送Intel酷睿12代CPU!还有机械键盘、固态硬盘。