字符串的最大最小表示法

字符串最大最小表示法详解 题目:给你一个字符串,每次可以移动后N位到前面来(如:abc可以变成cab和bca), 如果每次移动的字符串都大于或者等于原来的字符串,则输出Yes否则输出No。 其实这就是求该字符串的最小表示法是否为(或者等于)原来的字符串。 这里便涉及到了一个算法----字符串的最小(大)表示法 通过使用O(n) 的时间(n为字符串长度)来找出改字符串的最小表示的方法,就叫字符串的最小表示法,那么现在,我们... 阅读详情

算法描述:给定一个字符串s,可以进行左循环(右循环)移位,总共的结果有strlen(s)种,在这些结果中最小的是那个,最大的是哪个。
详解描述
论文传送门
HDU3374
题目意思:给定一个字符串s求循环几次会是字典序最小的(最小表示),最大的(最大表示),分别会出现几次。
思路:第一个用上面提到算法就可以算,后面的只需要求出以为后的有几个循环就就好了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6+10;
int Next[maxn];
int get_min(char s[])//最小表示法
{
    int len=strlen(s);
    int i=0,j=1,k=0;
    while(i<len&&j<len)
    {
        k=0;
        while(s[(i+k)%len]==s[(j+k)%len]&&k<len)
            k++;
            if(k>=len) break;
        if(s[(i+k)%len]>s[(j+k)%len])
        {
            i=i+k+1;
            if(i==j)
                i++;
        }
        else
        {
            j=j+k+1;
            if(j==i)
                j++;
        }
    }
    return min(i,j);
}
int get_max(char s[])//最大表示法
{
    int len=strlen(s);
    int i=0,j=1,k=0;
    while(i<len&&j<len)
    {
        k=0;
        while(s[(i+k)%len]==s[(j+k)%len]&&k<len)
            k++;
            if(k>=len) break;
        if(s[(i+k)%len]<s[(j+k)%len])
        {
            i=i+k+1;
            if(i==j)
                j++;
        }
        else
        {
            j=j+k+1;
            if(j==i)
                i++;
        }
    }
    return min(i,j);
}
void get_next(char s[])
{
    int len=strlen(s);
    int i=0,j=-1;
    Next[0]=-1;
    while(i<len)
    {
        if(j==-1||s[i]==s[j])
        {
            i++,j++;
            Next[i]=j;
        }
        else
            j=Next[j];
    }
}
char s[maxn],tmp1[maxn],tmp2[maxn];
int main()
{
    while(~scanf("%s",&s))
    {
        int len=strlen(s);
        int Min=get_min(s),Max=get_max(s),cont=0;
        for(int i=Min; i<len; i++)
            tmp1[cont++]=s[i];
        for(int i=0; i<Min; i++)
            tmp1[cont++]=s[i];
        cont=0;
        for(int i=Max; i<len; i++)
            tmp2[cont++]=s[i];
        for(int i=0; i<Max; i++)
            tmp2[cont++]=s[i];
            get_next(tmp1);
            printf("%d %d ",Min+1,len%(len-Next[len])==0?len/(len-Next[len]):1);
            get_next(tmp2);
            printf("%d %d\n",Max+1,len%(len-Next[len])==0?len/(len-Next[len]):1);
    }
}
字符串的最大/最小表示法 阅读详情

相关推荐

一文吃透 BMS:动力电池与储能共用的电池管控全架构详解

BMS作为电池系统的核心控制器,其技术深度和系统复杂性不容小觑。动力电池与储能系统虽然应用场景不同,但在核心架构上共享大量基础技术。成功的BMS设计需要在精度、可靠性、成本、功耗之间找到最佳平衡点。未来,随着电池技术的进步和智能化需求的提升,BMS将向着更高集成度、更强智能化、更优经济性的方向发展。无论是汽车工程师还是储能系统设计师,深入理解BMS的全栈架构,掌握其核心技术原理,都将是应对未来能源存储挑战的关键能力。核心要点回顾BMS采用分层分布式架构,硬件是基础,算法是灵魂。

小帽子的博客 337

字符串的最大值

这题的思想还是比较容易想到的,先使用kmp算法将对应字符串的next数组初始化出来,然后通过从后往前进行扫描,每次跳转到对应next数组标记的位置处,如果有的话就对应加上当前记录过的次数,举个例子,例如字符串abababa,对应next数组为0,0,1,2,3,4,5。然后从后往前进行扫描,例如扫到str[6],发现next[6]的值是4,先初始化一个num数组,将num数组的值加上1,然后就跳转到str[4]的位置,接着发现next[4]的值是2,先把num[4]的值加1,再加上它的“儿子”num[6].

zhentingfeng的博客 1873

基于航天宏图PIE-SAR软件的高分三号(GF-3)SAR影像的预处理

软件官网 航天宏图—国内领先的卫星运营与应用服务提供商(官网) 一、数据导入 数据导入-GF-3-根据模式选择 参数文件导入解压后GF-3数据的XML文件 通道自动填充 设置输出目录 确定 等待,加载图像、自动构建金字塔 二、复数数据转换 强度/幅度特征是SAR影像最主要的特征之一,基于SAR强度/幅度影像可以提取地物目标信息,因此需要将SAR复数数据转换为SAR强度/幅度数据。导入输入影像,设置参数类型,输出目录、命名、类型; 漫长的等待 三、多视 为提...

weixin_52127098的博客 9002

字符串的最小表示法

字符串的最小表示即将一个字符串S转换为它与它的循环同构中字典序最小的一个。什么是循环同构?即S中存在一个下标i使得 S[i...n-1]+S[0...i-1]=T,则S与T循环同构(将字符串切割为两个子串,将前子串和后子串换位拼接,或者理解为S循环左移或右移)。 打个比方,与字符串"CDAB"循环同构的字符串有"BCDA","ABCD","DABC",其中字典序最小的是"ABCD",即为这四个字符串的最小表示。

weixin_60344133的博客 728

保姆级教程:用DaVinci Configurator & Developer从零搭建AUTOSAR OS(TC2xx三核实战)

本文提供了一份详细的AUTOSAR OS配置指南,使用DaVinci Configurator和Developer工具从零开始搭建Infineon TC2xx三核系统。涵盖多核配置协同逻辑、版本兼容性陷阱及验证错误的解决方案,帮助开发者在3小时内构建可运行的多核OS框架。

weixin_33940469的博客 313

stm32h743 FM25CL64铁电存储器踩坑记录

调试FRAM经验总结: 1、跑完FRAM读写代码之后,逻分仪发现总线上只有简单、短暂的电平变化,明显不是SPI的通信数据。 (经提醒发现连片选拉高拉低都没有执行到位) 后来发现是因为片选引脚没有初始化,所以直接拉高拉低是无效的。 2、引脚成功初始化后发现CLK、MISO、MOSI数据仍不正常。通过加打印的方式发现跑到HAL_SPI_Transmit中之后还没有执行到写SPI数据寄存器的那一步就return了。 后来经提醒发现: 上图中的指针使用方式错误 后来又发现: 打印出来发现

kuniqiw的博客 3844

寒假:字符串最小表示

字符串最小表示 字符串最小表示,含义就是最小字典序排序,例如4321这字符串它可以有4321 3214 2143 1234当然这一眼就能够看出1234 是最小的。 求最小字典序最简单的方法,即也是最暴力的方法就是对于每一个可构成的字符串进行枚举,然后在是找到最小的一个,即字符串的最小表示,但是这样的时间复杂度是O(o*o)数据大了运行很慢。 这里要讲到一种方法,可以加快...

weixin_62513598的博客 1979

YOLOv11改进 | Conv篇 | 图像去雾卷积DEConv助力yolov11有效涨点(部署零额外开销)

本文介绍了一种最新改进机制用于低层视觉任务的细节增强卷积(DEConv)机制。DEConv在训练阶段采用"普通卷积+差分卷积"的多分支并联结构,增强网络对边缘、纹理等细节特征的学习能力;在推理阶段可折叠为标准3×3卷积,保持与普通卷积相同的计算效率。文中详细阐述了DEConv的工作原理、实现方法以及在YOLOv11中的应用步骤,包括核心代码解析、模型修改方法和训练配置。实验表明,该机制在去雾、去噪、超分等强调细节重建的任务中具有显著优势。文章还提供了完整的代码实现和训练指导.

Snu77的博客 2431

【字符串】最小表示法

给定一个字符串 s 和一个整数 k。你可以从 s 的前 k 个字母中选择一个,并把它加到字符串的末尾。字符串 S 的最小表示为与 S 循环同构的所有字符串中字典序最小的字符串。返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串。最小表示法是用于解决字符串最小表示问题的方法。当字符串 S 中可以选定一个位置 i 满足。则称 S 与 T 循环同构。...

文艺倾年的博客 1175

HyperLynx中层叠设计实例

这两种方式有点区别,前一种方式只是增加层,需要自行修改层的类型,后一种方式可以选定为某一种类型,如果是增加信号层,软件会默认同时增加一层介质层。层叠已经有8层,按照示例的层叠有4个信号层、3个地平面层和1个电源平面层,对照进行层名称(LayerName)、介质类型(Type)及用途(Usage)设置。在这列中,有的是白色,有的是淡蓝色。白色的说明可以修改,如第一行是介质,通常在最外层的介质有两个用途,阻焊层和介质,单击该行会出现一个下拉菜单,选择SolderMask,即为阻焊层。...

小幽余生不加糖 5874

【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍

Animancer与Unity Animator对比及使用指南 摘要: 本文对比了Animancer与Unity官方Animator的核心差异,分析了Animancer的优势特点。Animancer采用代码驱动模式,相比Animator的状态机系统更灵活高效,支持实时调试、动态混合和深度逻辑集成。文章详细介绍了Animancer的快速使用方法,包括动画播放、切换和触发机制,并区分了免费版与专业版的功能差异。适合需要高效动画开发、复杂交互逻辑的中小项目,为开发者提供了一种现代化的动画解决方案。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2433

字符串的最小表示

长度为n的字符串s,其字母序列表示为[0,1,2,…,n-1]。将其循环左移一位变为[1,2,…,n-1,0],记作s(1)。则s(k+1)为s(k)循环左移一位得到。s(0)就是s。一共可以得到n个字符串的集合,{s(0),s(1),…,s(n-1)},称为s的循环同构集合,n个字符串中字典序最小的那个称为集合的最小表示,也称为s的最小表示。如果字符串a、b属于同一个循环同构集合,则说二者是循环同

RBS的专栏 1924

robosuite 入门教程(一)安装与基本用法

摘要:Robosuite是基于MuJoCo的模块化机器人仿真框架,提供标准化基准测试环境和多样化机器人控制功能。作为ARISE计划的一部分,该框架支持强化学习、模仿学习等算法研究,包含程序化环境生成、多模态传感器、多种控制器及遥操作设备。支持macOS/Linux系统,提供详细安装指南和功能演示脚本,包括随机动作测试、控制器验证、域随机化等。最新版本v1.5新增人形机器人支持、全身控制器和照片级渲染功能,旨在降低机器人学习研究门槛,促进算法开发与评估。

2506_90492529的博客 1266

字符串——字符串的最大最小表示法

字符串的最大最小表示法 感谢这篇博客:字符串的最小表示法 引言:一个长度为n的字符串可以将最后一位放在第一位,这样就有n种变形。如"bcaxe" 可以变成 :ebcax xebca axebc caxeb 这几种。 字符串的最大最小表示法,就是求着n种变形中的最大最小字典序的字符串,返回的值是第一个最大最小的字符串的起始字符位置,时间复杂度为O(n)。 思想:(最小表示法) 就是定义三个下标初始 ...

wxy2635618879的博客 1469

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

字符串的最大、最小表示法

字符串的最大、最小表示法 前言 什么是字符串的最大、最小表示法? 对于一个字符串,求它的循环的同构字符串中字典序最大的就是最大表示法,同理字典序最小的就是最小表示法。 如:给定字符串为s=bacds=bacds=bacd,则最大表示法为dbacdbacdbac,最小表示法为acdbacdbacdb 求解字符串的的最小表示法 对于求最小表示法的实质就是找到一个位置,从这个位置开始的字符串的字典序最小,那么就可以利用指针来进行操作。 可以令i=0i=0i=0,j=1j=1j=1来表示最小位置,同时来维护更

qq_54484765的博客 1073

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

字符串处理 —— 最大最小表示法

【概述】 最大最小表示法用于解决字符串的同构问题,其在复杂度为 O(n) 的时间内求出一个字符串的所有同构串中字典序最大(小)的串的起始位置。 应用: 给出 n 个循环字符串判断有多少不同字符串:逐个用最大(小)表示法表示,然后加入 set 去重 循环字符串所有同构串中字典序最大(小)的表示:用最大(小)表示法求出起始位置,输出即可 判断两个字符串是否同构:将两字符串用最大(小)表示法表...

Alex_McAvoy的博客 1073

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HDU 3374 String Problem 字符串最大最小表示法 模板题

Give you a string with length N, you can generate N strings by left shifts. For example let consider the string “SKYLONG”, we can generate seven strings: String Rank SKYLONG 1 KYLONGS 2 YLONGSK...

zhangjinlei321的博客 317

ACM最小表示法 最大表示法 模板 及其使用环境 判断字符串循环重构

#include #include using namespace std; /* 用最小表示法求字符串S的最小字典序 返回字典序最小的串的首字母位置 */ int minSub(char * p) {  int i=0,j=1,len=strlen(p),k=0;  while(i<len && j<len &&k< len)  {   if(k==len) brea

hnust_xiehonghao的专栏 1469

js字符串的字典序_如何理解字符串的最大、最小表示法

一、什么是循环字符串的最小表示法对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。如:S=bacd,则S’可以是acdb,cdba,dbac,其中最小表示的S’是acdb。即该字符串的循环同构字符串中字典序最小的一个是acdb二、如何求解一个字符串的循环同构的最小表示求解这个问题,实质上是在S串中寻找一个位置,从该位置起循环输出S,此时得到的S’字典序是最小的思路一:首先我们比较容易...

weixin_35333277的博客 1085

字符串最大最小表示法模板 ( 字典序最大最小 )

模板 int getMin(char *s) { int i = 0, j = 1, l; int len = strlen(s); while(i < len && j < len) { for(l = 0; l < len; l++) i...

weixin_30809333的博客 185

String Problem HDU - 3374 KMP+字符串的最大最小表示法

做这个题前首先要明白字符串的最大最小表示法,我一开始也不会,看了题解也是一脸懵,附上一篇讲解字符串的最大最小表示法的博客链接(67条消息) 字符串处理 —— 最大最小表示法_Alex_McAvoy的博客-优快云博客,在这里感谢大佬指点迷津,orz 题意:每次给你一个字符串,如果字符串的长度为n,那你可以进行n次操作,每次操作都可以把一个字符从左边第一个移动到右边最后一个,因此你会得到n个字符串,问这n个字符串中字典序最小和最大的字符串排在第几个(如果有多个字典序最小或最大的字符串有多个,那么就.

weixin_54562114的博客 159

HDU - 3374 String Problem 求字符串的最大最小表示法 并求循环次数

HDU - 3374 String Problem 题意: 给你一串字符,这串字符可以左移(将最前面一个字符放到字符串最后面)生成 strlen(s) 个字符串,求出其中字典序最小 和 最大 的字符串在原串的起始位置和出现的次数(如果存在多个最小或最大串,则输出rank值小的,即下标小的那个)。 输出:最小字符串起始位置 出现次数 最大字符串起始位置 出现次数 思路: ...

没有梦想何以远行 235

HDU3374 字符串最大最小表示法模板

一开始没太看懂什么意思,拿笔反复推了一遍才大概知道最大最小表示法是怎么求的,感觉太神奇了... 1 #include <iostream> 2 #include <cstdio> 3 #include <string.h> 4 #pragma warning ( disable : 4996 ) 5 using namespac...

weixin_30335575的博客 118

如何理解字符串的最大、最小表示法

一、什么是循环字符串的最小表示法 对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。 如:S=bacd,则S’可以是acdb,cdba,dbac,其中最小表示的S’是acdb。即该字符串的循环同构字符串中字典序最小的一个是acdb 二、如何求解一个字符串的循环同构的最小表示 求解这个问题,实质上是在S串中寻找一个位置,从该位置起循环输出S,此时得到的S’字典序是最小的 思路一: 首先...

柠檬超级酸 991

字符串的最大最小表示法 模板

#include #includestring> using namespace std; /* 用最小表示法求字符串S的最小字典序 返回字典序最小的串的首字母位置 */ int minstr(char s[]) { int len=strlen(s); int i=0,j=1; while(i1 && j1) { int

elevendivide 308
上一篇: 扩展KMP
下一篇: hdu 2243 AC自动机+dp(矩阵快速幂优化)
acmer_zp
博客等级 码龄11年 18粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值