首页 > 其他分享 >【知识】字符串 最小表示法

【知识】字符串 最小表示法

时间:2024-12-05 22:44:43浏览次数:5  
标签:Min int 起始 最小 表示法 字符串

问题描述:

最小表示法是字符串 \(S\) 循环同构的所有字符串中,字典序最小的串是哪个。

最小表示法

考虑对于一对字符串 \(A,B\), 它们在原字符串 \(S\) 中的起始位置分别为 \(i,j\), 且它们的前 \(k\) 个字符均相同,即

\[S[i \cdots i+k-1]=S[j \cdots j+k-1] \]

不妨先考虑 \(S[i+k]>S[j+k]\) 的情况,我们发现起始位置下标 \(l\) 满足 \(i\le l\le i+k\) 的字符串均不能成为答案。因为对于任意一个字符串 \(S_{i+p}\)(表示以 \(i+p\) 为起始位置的字符串,\(p \in [0, k]\))一定存在字符串 \(S_{j+p}\) 比它更优。

所以我们比较时可以跳过下标 \(l\in [i,i+k]\), 直接比较 \(S_{i+k+1}\)

时间复杂度 \(\mathcal{O}(n)\)

#include<bits/stdc++.h>
using namespace std;
int n,ans,A[300009];
int Min_show(){
    int i=0,j=1,k=0;
    while(i<n&&j<n&&k<n){
      	if(A[(i+k)%n]==A[(j+k)%n]) k++;
      	else{
            if(A[(i+k)%n]>A[(j+k)%n])i+=k+1;
            else j+=k+1;
            if(i==j)i++;
            k=0;
        }
    }
    return min(i,j);
}
int main(){
    cin >> n;
    for(int i=0;i<n;i++)
        cin >> A[i];
    ans=Min_show();
    for(int i=0;i<n;i++)
        cout << A[(i + ans) % n] << " ";
    return 0;
}

标签:Min,int,起始,最小,表示法,字符串
From: https://www.cnblogs.com/fanrunze/p/18589581

相关文章

  • 使用 `window.crypto.subtle.digest` 为字符串生成SHA-256哈希签名
    使用window.crypto.subtle.digest方法,可以为字符串生成哈希签名。以下是一个示例,演示如何为字符串生成SHA-256哈希值:asyncfunctiongenerateHash(text){//将文本编码为UTF-8字节数组constencoder=newTextEncoder();constdata=encoder.encode(text......
  • mybatis Integer字段值传0,判断不等于空字符串,识别成空字符串排查解决
    mybatisInteger字段值传0,判断不等于空字符串,识别成空字符串排查解决根本原因:mybatis将传入的Integer类型的0被识别成空字符串在mbatis中使用Xml配置sql语句时,出现了这样一个问题。入的参数为0去做判断时,mybatis会把参数0当成是空字符串去判断而引起查询结果错误。insertinto......
  • 最小成本,最快速度 离线安装esp32/esp8266 arduino ide
    之前担任学校的实验室负责人,每届带新生都会给学弟学妹安装esp32/8266的编译环境,如果不采用离线安装的方式,步骤是繁琐的,而且很容易出错,可能得安装个两三天.  本身arduinoide是给初学者使用的,一个敲门砖,没必要在此浪费过多时间,下面是我分享的安装方法安装流程尽可能......
  • 字符串函数和内存函数
    字符串函数1、strlcpy 【字符串拷贝】(将原字符串中的字符拷贝到目标字符数组中,包括终止符号\0,并在这里停止;为了避免越界,目标字符串数组应该足够大去接收)......
  • 05-字符串
    05-字符串由英文双引号(DoubleQuote)引起来的一串字符称为字符串字面值(StringLiteral),或者简称字符串。【注】C语言中没有字符串类型!!!"abcdefghijklmnopqrstuvwxyz"一、证明(\0)字符串的结束标志是一个\0(转义字符),被隐藏起来了。【注】在计算字符串长度的时候\0是结束标志,不......
  • 反转字符串中每个单词的字符顺序,但保持单词之间的相对顺序不变(C++)
     需求:用户输入一行字符(一个英语句子lastweek,Iwenttocinima.),将该行字符按照每个单词逆序输出(即输出:tsalkeew,Itnewotaminic.)。要求1.写一个函数用来实现每个单词的字符顺序颠倒,拿到头和尾,对代码进行遍历(判断是否为单词首字母:当前为字母,前面是空格或者什么都没有;判......
  • SQL按指定字符分割字符串
    在SQL中分割字符串通常需要使用特定的函数,因为SQL本身并不像编程语言那样直接支持字符串分割。不同的数据库系统有不同的函数来处理字符串分割。以下是一些常见数据库系统中分割字符串的方法:1.MySQL在MySQL中,你可以使用SUBSTRING_INDEX()函数来分割字符串。这个函数接受......
  • vue中json对象数组求最大、最小、合计方法
    可以使用Array.reduce()方法来求最大、最小、合计值。示例代码如下://假设有以下json对象数组letarr=[{name:'tina',score:90},{name:'tom',score:80},{name:'john',score:70},{name:'jane',score:85}]//求最高分letmaxScor......
  • 字符串的截取、替换、切割方法
    1.截取subString()subString()方法有两种使用方式:1.第一种是在括号里只放入一个索引,这时将会从放入的索引为起点,一直截取到末尾2.第二种是在括号里放入两个索引,分别对应截取的头和尾,其中截取不包括尾。如:(0,4),这样只会从索引0开始截取到索引3练手明明使用了截取方法,控制台打印的......
  • 人形机器人:从零开发人形机器人 —— 某开源的个人DIY版本(2500元DIY世界最小,开源端到端
    相关介绍:https://www.bilibili.com/video/BV1in6PY7E1B......