首页 > 其他分享 >最小表示法

最小表示法

时间:2023-03-09 15:45:22浏览次数:44  
标签:int 位置 最小 原串 表示法 枚举 循环 指针

思路

考虑将原串复制一遍,就可以得到所有循环同构串,然后先枚举两个位置 \(i,j\),分别对应第一个和第二个位置。然后往后枚举,遇到第一个不同的位置,那么另外一个大的数对应的指针位置之前的每个循环同构串都不如第一个来的优,所以可以直接跳到这个位置的下一个位置。即假设 \(s_i>s_j\),则 \(j=k+1\),\(k\) 表示从两个位置往后第一个不同的字符所枚举的个数。还有,如果 \(i=j\),那么需要考虑将其中一个往后挪,再者如果 \(k=n\) 了,那么说明原串是个循环串,如图:
ppnmES1.png
下图中第一条红线是由 \(i,j\) 指针的移动定义得出的,第二条则是由同位置的数相等得到的,后面的也可以通过前两条关系类比推出,而且循环恰好是 \(|i-j|\),这时退出,任意返回两指针任一即可。

#include<bits/stdc++.h>
using namespace std;
const int N=600010;
int n,s[N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i)scanf("%d",s+i);
	int i=1,j=2;
	memcpy(s+n+1,s+1,sizeof(n)*n);
	while(i<=n&&j<=n){
		int k=0;
		while(k<n&&s[i+k]==s[j+k])++k;
		if(k==n)break;
		if(s[i+k]<s[j+k])j+=k+1;
		else i+=k+1;
		if(i==j)++i;
	}
	i=min(i,j);
	for(int k=i;k-i+1<=n;++k)printf("%d ",s[k]);
	return 0;
}

标签:int,位置,最小,原串,表示法,枚举,循环,指针
From: https://www.cnblogs.com/wscqwq/p/17198708.html

相关文章

  • 戴尔R750服务器 安装 ubuntu 22.04 最小话安装后 初始化设置
    1.设置root密码sudopasswdroot显示如下先输入test的密码之后输入root需要设置的密码2次[sudo]passwordforccpit:Newpassword:Retypenewpassword:passwd:p......
  • R语言两阶段最小二乘法2SLS回归、工具变量法分析股息收益、股权溢价和surfaces曲面图
    全文链接:http://tecdat.cn/?p=31757原文出处:拓端数据部落公众号投资者最关心的两个问题就是收益率和股息,两者作为公司经营状况的两个重要方面,往往同时出现在投资报告中,二......
  • 从零开始学习Kruskal最小生成树
    -1919810.前言如果你想要学好Kruskal最小生成树的话,那么你就得先学好Kruskal最小生成树,你一看这个Kruskal最小生成树,你想掌握它还真不容易,基础知识里头你就得掌握Kruskal......
  • 类与类之间的关系表示法
    1.关联关系:       2.聚合关系:  3.组合关系:  4.依赖关系:  5.继承关系:  6.实现关系: ......
  • 力扣---64. 最小路径和
    给定一个包含非负整数的mxn网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例1:输入:grid=[[1,3,1......
  • 209. 长度最小的子数组 (Medium)
    问题描述209.长度最小的子数组(Medium)给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组[numsₗ,num......
  • 经典dp之字符串最小编辑距离
    经典dp之字符串最小编辑距离模板题给定两个串a,b,然后有3个操作:增加任意一个字母,删除任意一个字母,改变某个字母,然后问将a变成b要多少次操作这位大佬已经讲得很详细了\(f......
  • debian最小化+sway安装记录
    最小化安装debian(基于虚拟机kwm安装,gui界面virt-manager)因为虚拟机安装,虚拟机中粘贴复制命令操作不方便,安装ssh服务器便于操作,其它皆未安装。安装完成后配置ssh允许roo......
  • C语言:最大公约数和最小公倍数
    #include<stdio.h>//求任意两个数的最小公倍数main(){inta,b,i;scanf("%d%d",&a,&b);for(i=a;i<=a*b;i++)if(i%a==0&&i%b==0){......
  • 154. 寻找旋转排序数组中的最小值 II (Hard)
    问题描述154.寻找旋转排序数组中的最小值II(Hard)已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,4,4,5,6,7]......