首页 > 其他分享 >MCE 学习笔记

MCE 学习笔记

时间:2024-04-07 12:55:18浏览次数:26  
标签:同构 MCE 位置 最小 笔记 学习 开头 字符串

MCE 学习笔记

最小表示法。

你说的对,月考考完了,但是感觉基本炸了。/ll/ll,相对失败。

艹,写了我一个晚上。

\(\frac{3}{20}\),还差的远呢。

闲话:MCE 是 a3 叫的,不过感觉挺好听。

这个算法出题的话可能就比较板了,所以不是很热门?

不废话了。

引入定义:

  • 循环同构,对于两个字符串 \(S\) 和 \(T\),如果可以在 \(T\) 中找到一个位置,使得从这个位置开始在这个字符串绕一圈(就把这个字符串看成环),使得他和 \(S\) 相等,那么说明 \(S\) 和 \(T\) 是循环同构的。

  • 定义字符串 \(S\) 中从 \(l\) 为起点,\(r\) 为终点的字符顺次连接组成的字符串为 \(S(l,r)\)。

容易发现,能和 \(S\) 构成循环同构的字符串,一定是从 \(S\) 任意一个位置开头,转一圈得到的字符串。(根据定义,\(T\) 复原成 \(S\) 的过程,反过来就是 \(S\) 断开组成 \(T\) 的过程。)

所以,完全可以通过复制两次 \(S\),找到所有和 \(S\) 循环同构的字符串。

最小表示法解决的问题就是,对于 \(S\) 所有与其循环同构的字符串中,找到字典序最小的。

因为这样的字符串只有 \(n\) 个,所以显然有 \(O(n^2)\) 的做法。

但是这个东西,可以 \(O(n)\)。

首先有两个下标 \(i,j\),考虑我们正在比较以 \(i\) 为开头和以 \(j\) 为开头的两个循环同构哪个更优,当前比较了前 \(k\) 位都是一样的。

先提醒一下,对于 \(i\) 这个位置,(包含 \(i\))往后第 \(k\) 个位置是 \(S_{i+k-1}\)。

分类讨论。

  • 如果 \(k+1\) 也相同,那么 k++ 即可。
  • 如果不同,假设 \(S_{i+k}<S_{j+k}\),可以发现,以 \(i\) 开头的更优,同时,从 \([j,j+k]\) 所有位置的,都不优。,\(j\) 直接跳到 \(j+k+1\) 即可。

原因显然,如果以 \(i+1\) 和 \(j+1\) 开头比较的话,(就相当于\(S(i,i+k)\)和 \(S(j,j+k)\) 删掉一位。) 到第 \(k+1\) 位 以 \(j+1\) 开头的不优,依此类推,到第 \(k+1\) 位,都是不优的。

时间复杂度证明:可以发现,\(i\) 和 \(j\) 都不会走回头路,类似双指针。那么一个位置最多会被踩两次,时间复杂度为 \(O(n)\)。

讲讲代码,代码比较高妙。

int MCE(){
	for(int i=1;i<=n;i++)	c[i]=c[i+n]=a[i];
	int i=1,j=2;
	while(i<=n&&j<=n){
		int k=1;
		while(k<=n&&c[i+k-1]==c[j+k-1])	k++;
		if(k>n)	break;
		if(c[j+k-1]>c[i+k-1])	j=j+k;
		else	i=i+k;
		if(i==j)	j++;
	}
	return min(i,j);
}

思考两个问题:

  • 最后 return min(i,j) 的原因?如果 \(i\)(或者 \(j\))是劣的且 \(i\) 跳到 \(i+k\) 后大于 \(n\),跳出循环,这时候原先的 \(i\) 是劣的那个,不能取,且一定大于 \(j\)。(或者说,此时的 \(i\) 根本就没存任何一个位置的答案。)

  • if(k>n) break; 原因? 这个很厉害。这要满足,如果一个字符串 \(S=T+T+...+T\) 的话,(\(T\) 长度最小。)\(i\) 恰好是 \(T\) 中字典序最小的位置(这个可以反证,如果不是最小的话,在匹配就不能构成连续 \(n\) 个均可以匹配。就是不满足 \(k>n\))。

这个时候 \(j\) 就又恰好移动到了 \(i+m\) 的位置,(这个也可以反证,不然不满足 \(T\) 是长度最小的,证出来发现 \(T=S(i,j-1)\) 才是最小的,和假设矛盾。用UVA10298来理解,就是把 \(S(i,i+n-1)\) 和 \(S(j,j+n-1)\) 上下来看,一直上下拼推一推就行。)进而和从 \(i\) 开始往后的 \(n\) 个字符,都是一样的了,所以 \(i\) 就是最优的。

注意细节,if(i==j) j++,一定要这一步,不然匹配了两个相同位置开头的字符串就一定执行 if(k>n) break,求出来就不是正确答案了。

没有什么习题。

CF496B

标签:同构,MCE,位置,最小,笔记,学习,开头,字符串
From: https://www.cnblogs.com/JuneFailue/p/18118830

相关文章

  • Python学习(八):python面向对象编程
    文章目录python面向对象编程类的定义类的实例化类的静态变量与静态方法类的静态变量类的静态方法@staticmethod类的类方法@classmethod类的继承单继承多继承多层继承类方法的重写类方法的重载调用父类的方法super函数python面向对象编程面向对象(ObjectOriented)......
  • Python学习(七):基础运算符与表达式【详解】
    文章目录python基础运算符与表达式运算符与表达式的优先级算术运算符(四则运算)算术运算符(取余/模、乘方)关系比较运算符位运算符逻辑运算符赋值运算符、复合赋值运算符条件表达式await序列切片表达式星号表达式yield表达式lambda表达式python基础运算符与表达式运算符......
  • 实习笔记 之 components 包下文件描述
    _util:存放自定义函数AvatarList:显示头像群并支持tip(文字提示)chart:存放各种图表相关的组件,如条形图柱形图折线图等countDown:倒计时组件,该组件有3个属性:target:时间/毫秒数,必填format:该方法接收一个毫秒数的参数,用于格式化显示当前倒计时时间,非必填onEnd:倒计时结束触发......
  • 【阅读笔记】MySQL的多版本并发控制(MVCC-Multiversion Concurrency Control)
    摘自:高性能MySQL(第四版)MVCC的作用InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,MultiversionConcurrencyControl)解决了幻读的问题MVCC的应用MySQL的大多数事务型存储引擎使用的都不是简单的行级锁机制。它们会将行级锁和可以提高并发性能的多版本并发控制(MVCC)技术结合使用......
  • 实习笔记 之 前端技巧
    下拉选项滚动错位问题描述:当使用了  a-modal  或其他带有滚动条的组件时,使用  a-select  组件并打开下拉框时拖动滚动条,就会导致错位的问题产生。解决方法:大多数情况下,在  a-select  上添加一个  getPopupContainer  属性,值为 node=>node.parentNode  ......
  • AndroidStudio学习记录(4):单选按钮控件RadioButton
    用于应用二选一等多选选项的设置<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical">&l......
  • 深入探索MySQL:成本模型解析与查询性能优化,及未来深度学习与AI模型的应用展望
    码到三十五:个人主页在数据库管理系统中,查询优化器是一个至关重要的组件,它负责将用户提交的SQL查询转换为高效的执行计划。在MySQL中,查询优化器使用了一个称为“成本模型”的机制来评估不同执行计划的优劣,并选择其中成本最低的那个。本文将深入探讨MySQL的成本模......
  • Docker基本学习(运维)
     一、背景介绍1.什么是dockerDocker,翻译过来就是码头工人Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几乎没有性能开销,可......
  • YOLO系列笔记 · 二 · v1
    YOLO系列笔记·二·v1YOLO-V1概述核心思路网络结构数据结构解释损失函数1.位置误差(BoundingBoxPrediction)2.置信度误差(ConfidencePrediction)3.分类误差(ClassPrediction)NMS(非极大值抑制)存在的问题YOLO-V1概述YOLOv1(YouOnlyLookOnce版本1)作为经典的单......
  • 强化学习—PPO代码实现及个人详解1(python)
    上一篇文章我们已经搞定了如何搭建一个可以运行强化学习的python环境,现在我们就跑一下代码,这里我对代码加上一些个人理解,方便基础差一些的朋友进行理解和学习。我在这段时间对强化学习进行了学习,所以知识和代码基本来自这本:磨菇书一、定义模型importtorch.nnasnnimport......