一切的开始

令 \(x\) 为字符串,\(p\) 为正整数。如果对于满足 \(0\le i<|x|−p\) 的任何整数 \(i\) 满足 \(x[i]=x[i+p]\),则 \(p\) 称为 \(x\) 的周期。\(x\) 的最小周期表示为 \(per(x)\)。例如,\(per(abcabcabcab)=3\)。

令 \(N\) 为输入字符串 \(w\) 的长度。 情况划分如下:

(a)如果 \(w\) 是一个好的字符串(例如 \(w=ababa\))
(b)当 \(per(w)=1\) 时(例如 \(w=aaaaa\))
(c)其他情况(例如 \(w = abcabcabc\))

在(a)的情况下,最佳表达明显为 \(1\),最佳表达的为 \(1\)。
在(b)的情况下,最佳表达为 \(N\),最佳表达的为 \(1\)。
在情况(c)中,我们可以证明最佳表达为 \(2\)(请参见下面的定理 \(5\))。

定理 2

由 \(\text{KMP}\) 或者 \(\text{Z-Algorithm}\) 可知,如果正整数 \(p,q\) 是字符串 \(x\) 的周期,且 \(p+q-\gcd(p,q)\le |x|\),则 \(gcd(p,q)\) 也是 \(x\) 的周期。

引理 3

令 \(x\) 为非空字符串,以下两个是等效的。

(i) \(x\) 不是好的字符串

(ii) \(|x|/per(x)\) 为 \(2\) 或更大的整数。

首先,如果 (ii) 成立,那么 (i) 肯定成立,所以在下文中 (i) 就是 (ii) 。

如果 \(x\) 不是一个好的字符串,\(|x|/per(x)\ge 2\) 从定义来说显而易见。接下来我们只需要证明 \(|x|/per(x)\) 是一个整数,\(x\) 不是一个好的字符串意味着存在一个字符串 \(y\) 和一个整数 \(k\ge 2\),使得 \(x\) 是 \(y\) 重复 \(k\) 次后获得的字符串。令 \(p=per(x),q=|y|\),则 \(p\le q=|x|/k\le |x|/2\),由于 \(p,q\) 都是 \(x\) 的周期,且满足 \(p+q-\gcd(p,q)\le |x|\),由定理 \(2\) 知,\(\gcd(p,q)\) 是 \(x\) 的周期,假设 \(|x|/per(x)\) 不是整数,则 \(q\) 不是 \(p\) 的倍数,此时 \(\gcd(p,q)<p\),这与 \(p=per(x)\) 是 \(x\) 的最小周期相悖,因此 \(|x|/per(x)\) 是一个整数。

引理 4

令 \(x\) 为长度为 \(2\) 或更大的字符串。令 \(m=|x|\)。此外,令 \(y=x [1...m − 1]\)。如果 \(x\) 不是一个好的字符串,并且 \(per(x)\not=1\),则 \(y\) 是一个好的字符串。

假设 \(y\) 不是一个好的字符串。令 \(p=per(x),q=per(y)\)。根据引理 \(3\) 和之前的假设,\(p\) 是 \(m\) 的约数,\(q\) 是 \(|y|=m-1\) 的约数。因为 \(m\) 与 \(m-1\) 互质,因此 \(p\) 与 \(q\) 也互质,即 \(\gcd(p,q)=1\),此外,\(p\le m/2,q\le(m-1)/2\),其中 \(p\) 也是 \(y\) 的周期,因此,根据定理 \(2\),\(\gcd(p,q)=1\) 是 \(y\) 的周期,因此从 \(x[0]=x[p]\) 开始,\(x\) 的最后 \(m-1\) 个字符全部变为与 \(x[0]\) 相同的字符,此时 \(per(x)=1\),这与前提矛盾,故 \(y\) 是一个好的字符串。

定理 5

对于一个字符串 \(w\),假设 \(w\) 不是一个好的字符串,并且 \(per(w)\not=1\)。 此时,\(w\)的最佳表达为 \(2\)。

长度为 \(1\) 的字符串显然是一个好的字符串。 此外,根据引理 \(4\),\(w[1...|w|−1]\) 是一个好的字符串,因此序列\((w [0],w[1...|w|-1])\) 是 \(w\) 是最佳表达之一。 显然,\(w\) 没有1或更小的最佳表达。则 \(w\) 的最佳表达为2。

Atcoder Regular Contest 060 F题第一问答案证明的更多相关文章

  1. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  2. AtCoder Beginner Contest 215 F题题解

    F - Dist Max 2 什么时候我才能突破\(F\)题的大关... 算了,不说了,看题. 简化题意:给定\(n\)个点的坐标,定义没两个点的距离为\(min(|x_i-x_j|,|y_i-y_j ...

  3. AtCoder Regular Contest 074 F - Lotus Leaves

    题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_d 题目大意: 给定一个\(H×W\)的网格图,o是可以踩踏的点,.是不可踩踏的点. 现有一人 ...

  4. AtCoder Regular Contest 081 F - Flip and Rectangles

    题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...

  5. [Atcoder Regular Contest 060] Tutorial

    Link: ARC060 传送门 C: 由于难以维护和更新平均数的值: $Average->Sum/Num$ 这样我们只要用$dp[i][j][sum]$维护前$i$个数中取$j$个,且和为$s ...

  6. 【AtCoder Regular Contest 082 F】Sandglass

    [链接]点击打开链接 [题意] 你有一个沙漏. 沙漏里面总共有X单位的沙子. 沙漏分A,B上下两个部分. 沙漏从上半部分漏沙子到下半部分. 每个时间单位漏1单位的沙子. 一开始A部分在上面.然后在r1 ...

  7. 【arc077f】AtCoder Regular Contest 077 F - SS

    题意 给你一个形如"SS"的串S,以及一个函数\(f(x)\),\(x\)是一个形如"SS"的字符串,\(f(x)\)也是一个形如"SS"的 ...

  8. AtCoder Beginner Contest 213 F题 题解

    F - Common Prefixes 该题也是囤了好久的题目了,看题目公共前缀,再扫一眼题目,嗯求每个后缀与其他后缀的公共前缀的和,那不就是后缀数组吗?对于这类问题后缀数组可是相当在行的. 我们用后 ...

  9. AtCoder Regular Contest 076 F - Exhausted?

    题意: n个人抢m个凳子,第i个人做的位置必须小于li或大于ri,问最少几个人坐不上. 这是一个二分图最大匹配的问题,hall定理可以用来求二分图最大匹配. 关于hall定理及证明,栋爷博客里有:ht ...

随机推荐

  1. AS shortcuts

    stl => statelessstf => statefulalt+enter, select element => add pading or somethingselect c ...

  2. Spring 实战 第4版 读书笔记

    第一部分:Spring的核心 1.第一章:Spring之旅 1.1.简化Java开发 创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB.相对EJB来说,Spring提供 ...

  3. elasticsearch获取字段missing的数据

    用head查询: demo如下 http://localhost:9200/sj_0505/lw_point_location/ _search post { "query": { ...

  4. Linux--基本目录

    特点 系统版本:CentOS 6.5 Linux目录:一切从根开始 Linux下面的设备(磁盘)不挂载的话没有办法使用,使用设备必须有一个入口,挂载点实质就是一个目录. 目录结构及含义 目录 说明 b ...

  5. 解决maven install报错:java.lang.NoClassDefFoundError: org/codehaus/plexus/compiler/util/scan/InclusionScanException

    问题:maven install时,报错:java.lang.NoClassDefFoundError: org/codehaus/plexus/compiler/util/scan/Inclusio ...

  6. jenkins使用邮件功能

    jenkins发送邮件 在日常构建后,需要及时将构建结果发送给相应的人员.这时就可以使用jenkins自带的邮件配置系统. 1 开通邮箱的SMTP服务,需要发送短信验证开启 2 进入"系统管 ...

  7. 剖析和解决Python中网络粘包的正确姿势

    目录 1.粘包及其成因 1.1.粘包产生 1.2.粘包产生的原因 2.尝试解决粘包 2.1.指定数据包的长度 2.2.固定数据包的长度 2.3.用函数实现多次调用发送数据 3.解决粘包问题的正确姿势 ...

  8. 微信小程序~TabBar底部导航切换栏

    底部导航栏这个功能是非常常见的一个功能,基本上一个完成的app,都会存在一个导航栏,那么微信小程序的导航栏该怎么实现呢?经过无数的踩坑,终于实现了,好了,先看看效果图. 对于底部导航栏,小程序上给出的 ...

  9. python开发应用笔记-SciPy扩展库使用

    SciPy https://www.scipy.org/ SciPy中的数据结构: 1.ndarray(n维数组) 2.Series(变长字典) 3.DataFrame(数据框) NumPy适合于线性 ...

  10. 记录一下使用element ui使用级联选择器的坑,级联选择器的默认选中

    Cascader 级联选择器 使用级联选择器我使用的是默认选中值 下面是我的数据格式,只是形式相同,值不同, 后台的数据是这样的不是ID //级联选择器 <el-cascader :props= ...