Border Theory

border 定义:在同一个串中既是前缀又是后缀。

最长border:最长的 border

性质1:

一个串 border 的 border 还是它的 border。画图自己推,很简单的。

border 求法 :

首先,border 的左端点显然会随着 i 向右枚举,向左移动。

看下一个字符是否能匹配,匹配不上就跳 border 的 border。

nxt[1] = 0; // nxt 是 最长border对应前缀长度
for(int i = 2, j = 0; i <= n; ++ i) {
while(j && s[j + 1] != s[i]) j = nxt[j];
if(s[j + 1] == s[i]) ++ j;
nxt[i] = j;
}

KMP 的字符串匹配也差不多就是这么搞的。

失配树

把一个串对应的点连向其最长 border 对应的前缀节点,构成的树。按着根链跳就可以找到所有 border。

作用1:可以找到两个串的公共 border。(用 LCA 求)


定义周期 :如果 \(\forall i\le |s|-T,s_i=s_{i+T}\),则称 \(T\) 为 \(s\) 的周期。

性质1:

如果 b 是 s 的一个 border,则 \(p = |s| - |b|\) 是 s 的一个周期。

证明显然。。。

性质2:

如果 p 和 q 是 s 的周期,且 \(p + q \le |s|\) ,那么 \(\gcd(p,q)\) 也是 s 的周期。

证明:画出图后很好感性理解。

令 \(p > q\)

当 \(i \le q\),\(s_i = s_{i+p} = s_{i+p - q}\)

当 $i < |s| - p + q $ && $ i > q\(,\)s_i = s_{i - q} = s_{i-q+p}$。

根据辗转相减可得此结论。

推论:若 \(p,q\) 均为 \(s\) 的周期,且 \(p+q-gcd(p,q)\leq|s|\),则 \(gcd(p,q)\) 也是 \(s\) 的周期。

证明不会 qwq

定理1:

s 所有长度大于 \(\lfloor\frac{|s|}2\rfloor\) 的 border 与 |s| 构成等差数列。

设最长 border 长为 b,故一定有周期 \(p = |S| - b\) ,故一定有周期 \(2*p,3*p...k*p,k\in N\) 。故存在一些 border 长度为等差数列。

假设还有一个 border 长度大于 \(|s| / 2\) 并且不是等差数列,设其对应的周期为 q,那么 \(\gcd(p,q)\) 也是周期,那么 \(s - gcd\) 也是 border,然后就矛盾了。GG

推论:

s 所有 border 可以分类分成至多 log 个等差数列。

长度大于 s / 2 的是一类,然后长度在 (s / 4,s / 2) 在一类,这类 border 可以当作是这个区间里最长的 border 的 border 。。。所以有最多 log 类。


做题

[NOI2014] 动物园

对于所有前缀 s ,求长度小于 \(s / 2\) 的最长 border。

就是找到最后一个长度大于 \(s / 2\) 的那个border 后再跳一次最长 border。

根据定理1 : s 所有长度大于 \(\lfloor\frac{|s|}2\rfloor\) 的 border 与 |s| 构成等差数列,就可以很轻松的找到 最后一个长度大于 \(s / 2\) 的那个border 。

核心代码:int p = i - nxt[i], k = nxt[i - ((i - 1) / 2) / p * p];

P1393 Mivik 的标题

随机生成一个串,每个字符是 [1, m] ,求出现目标串的概率。

转计数题,求出现目标串方案数。

设 \(f_i\) 表示在第 i 个位置第一次匹配上目标串的方案数。

考虑转移,钦定 i 位置匹配了 s ,前面后面都随便选,减掉在前面匹配上的。

匹配在 [s,i - s] 的位置 : \(\sum f_j m^{i - s - j + 1}\) ,这个用秦九昭跑一跑就行了。很好搞。

匹配在 [i - s+ 1, s-1] 的位置,观察发现肯定只有 s 的 border 才匹配的上, s 的 border 可以分为 log 个等差数列,对于每个等差数列:\(\sum_k f_{i-kp}\),这个可以对每一个 p 维护这个世子的前缀和之类的,就行了。

Border Theory 学习笔记的更多相关文章

  1. 欧几里德欧几里德原理和扩展的原则,(Euclidean Theory and Extended Euclidean Theory)学习笔记

    题记:这是我第四次审查扩展欧几里德原理,由于不经常使用.当你想使用,可以不记得细节,经常检查信息,所以,简单地梳理这一原则和扩展欧几里德的原则,以博客存档以备查用. 一个.欧几里德原理 欧几里德原理( ...

  2. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  3. Sass学习笔记之入门篇

    Sass又名SCSS,是CSS预处理器之一,,它能用来清晰地.结构化地描述文件样式,有着比普通 CSS 更加强大的功能. Sass 能够提供更简洁.更优雅的语法,同时提供多种功能来创建可维护和管理的样 ...

  4. CSS3与页面布局学习笔记(八)——浏览器兼容性问题与前端性能优化方案

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  5. 【前端】移动端Web开发学习笔记【2】 & flex布局

    上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...

  6. jQuery 学习笔记

    jQuery 学习笔记   一.jQuery概述    宗旨: Write Less, Do More.    基础知识:        1.符号$代替document.getElementById( ...

  7. 初学c# -- 学习笔记(一)

    初学c# -- 学习笔记(一) 学习C#了,参考许多资料,一步步学习.这一段学习ajax的工作原理,参照其他例子写了web版的群聊小程序,全部文件代码也就不到300行,很简单.使用时先输入用户名,点确 ...

  8. Ext2.x学习笔记

    Ext2.X学习笔记一 一.ExtJS简介  1.1 什么是Ext JS? · Ext JS是一个Ajax框架,可以用来开发富客户端的Ajax应用,是一个用javascript写的,主要用于创建前端用 ...

  9. Extjs 学习笔记1

    学习笔记 目   录 1 ExtJs 4 1.1 常见错误处理 4 1.1.1 多个js文件中有相同的控件,切换时无法正常显示 4 1.1.2 Store的使用方法 4 1.1.3 gridPanel ...

  10. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

随机推荐

  1. leetcode 53 最大自序列和

    简介 暴力只要变量两遍, 挺好的, 不过更好的应该是动态规划. 应该是最简单的动态规划了吧 code class Solution { public: int maxSubArray(vector&l ...

  2. python 简单socket

    简介 python 简单socket code import socket HOST = '103.46.128.53' PORT = 24876 BUFSIZ = 1024 ADDR = (HOST ...

  3. POLIR-财政- 财政分级制度: 一级财政、二级财政 和 三级财政 及 计划单列市

    地方财政 受制于中央财政,自主度高 的 盈余多:发展的就好,经济繁荣富强度更高. 财政 和 税制 在财政体系中,通常根据行政级别和职能的不同,将财政划分为不同的层级. 这里我们主要讨论的是一级财政.二 ...

  4. babylon.js 学习笔记(2)

    如何在网页中嵌入设计好的模型? 接上回继续,我们设计好精美的模型后,最终总要展示给客户,比如利用playground画了1个方块: const createScene = () => { con ...

  5. spring项目run起来的最小依赖

    spring项目跑起来,只需要spring-context这1个依赖项就行,参考下面: 一.pom.xml 1 <?xml version="1.0" encoding=&q ...

  6. Web前端入门第 80 问:JavaScript 哪些地方需要 try...catch 异常捕获

    前端开发一直有种错觉,好像异常捕获都是后端的事,毕竟后端开发时如果不处理代码中的异常,有些资源得不到释放,极其容易导致内存泄漏. 前端由于 JS 的垃圾回收机制无需手动释放资源,反而不会怎么使用异常捕 ...

  7. Navicat premium 15安装+激活-九五小庞

    下载安装包:https://wwz.lanzoue.com/b021z9k1e 密码:7pm1 Navicat Premium 15 安装教程: 一.解压后,双击安装包 ​ 二.点击下一步 ​ 三.勾 ...

  8. 将AtomicInteger对象作为方法的局部变量, 传递给其他线程, 读写操作是否是线程安全的?

    目录 将AtomicInteger对象作为方法的局部变量, 传递给其他线程, 读写操作是否是线程安全的? 场景 代码 运行结果 总结 将AtomicInteger对象作为方法的局部变量, 传递给其他线 ...

  9. ABC347F 题解

    我们考虑这三个正方形的相对位置有多少种情况. 我们把正方形的顶点设为 \((x_i,y_i)\).容易发现,放置合法当且仅当 \(\forall i \neq j, | \ x_i - x_j \ | ...

  10. [笔记]中国剩余定理(CRT) & 扩展中国剩余定理(exCRT)

    中国剩余定理(CRT) P1495 [模板]中国剩余定理(CRT)/ 曹冲养猪 对于线性同余方程组: \[\begin{cases} x\equiv a_1\pmod{b_1}\\ x\equiv a ...