一切的开始

令 \(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. Matlab责任链模式

    责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦,本人根据https://www.ru ...

  2. 【开发工具】-Idea代码提示忽略大小写

    设置路径:File–>Settings–>Editor–>General–>Code Completion–>Match case 取消Match case 勾选. [o ...

  3. canvas教程(一) 简介

    什么是 canvas 按例是要介绍一下 canvas 的,在没有 canvas 之前,我们为了网页的效果,很多情况下是使用了图片来实现,不过用图片就需要加载,而且图片的体积也是一个问题,所以在 htm ...

  4. linux上安装redis-单机版

    1. Redis的安装 1.1. Redis的安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一 ...

  5. 【OGG】RAC环境下配置OGG单向同步 (四)

    [OGG]RAC环境下配置OGG单向同步 (四) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的 ...

  6. bug集锦------持续但不定期 更新

    对于个人而言:这个错误集锦是很有必要的. 为了避免误导他人,其中个人想法:用 紫色加粗 标注. 1.springboot端口冲突: Protocol handler start failed2.spr ...

  7. Jmeter连接mysql,如何用delete、update、insert真正删除、更改、插入数据库里的数据;

    1.如下图,当插入数据的时候如图对应填写,查询数据的时候上面插入的那条数据就会显示,但是如果不执行下图的提交数据:到数据库里查的时候,插入的这条数据实际上并没有插入成功: . 结果:如果没有提交数据, ...

  8. C#锐利体验2读书笔记

    匿名方法,迭代,匿名方法允许我们以一种“内联”的方法来编写方法代码;匿名方法是直接与委托实例化相关联的,使委托实例化更加直观方便.匿名方法的几个相关问题--参数列表,--返回值,--外部变量. add ...

  9. 【http】Coolie 属性

    expires属性 指 定了coolie的生存期,默认情况下coolie是暂时存在的,他们存储的值只在浏览器会话期间存在,当用户推出浏览器后这些值也会丢失,如果想让 cookie存在一段时间,就要为e ...

  10. 怎样在一条sql语句中将第一列和第二列加和的值作为第三列的值

    今天在写代码的时候,遇到的一个小问题,特意记下来,以免自己以后忘记了. 在一个表单里面,要表单的第一列和第二列的值查询出来,做和,作为第三列的值. select 1 as a,2 as b,(a+b) ...