字符串最小最大表示法(样题HDU-3374 String Problem)

字符串的最大/最小表示法 阅读详情

字符串最小最大表示法

爆肝模式开启o( ̄▽ ̄)ブ

  1. 有没有想过,如何求一个字符串的最大(最小)的表示方法,以下思维是从一个字符串中,找到最大的字母所在的位置,然后拼连成最大or最小的字符串。

  2. 我们先从一个简单的例子谈起吧,比方说ABCD,那我可以有几种形式表示呢?

    ABCD BCDA CDAB DABC

我们可以通过两个指针 X,Y来标记

其基本思路如下

令x=0,y=1
如果S[x] > S[y] x=y, y=x+1
如果S[x] < S[y] y++
如果S[x]==S[y] 设指针k,分别从x和y位置向下比较,直到S[x] != S[y]
如果S[x+k] > S[y+k] x=y,y=x+1
否则y++
返回x

但是

步子有点小,容易超时啊

这时候就应该改进了

令x=0,y=1
如果S[x] > S[y] x=y, y=x+1
如果S[x] < S[y] y++
如果S[x]==S[y] 设指针k,分别从x和y位置向下比较,直到S[x] != S[y]
如果S[x+k] > S[y+k] x=x+k
否则j++
返回x和y的小者

在比较中可以用char强制转int直接用scaII码对比,也可以单字符对比,看个人喜好了

下面用强制转码对比

//最小表示法
int get_minstring(char *s)
{
   int len = strlen(s);
   int i = 0, j = 1, k = 0;
   while(i<len && j<len && k<len)
   {
       int t=s[(i+k)%len]-s[(j+k)%len];
       if(t==0)
           k++;
       else
       {
           if(t > 0)
               i+=k+1;
           else
               j+=k+1;
           if(i==j) j++;
           k=0;
       }
   }
   return min(i,j);
}

//最大表示法
int get_maxstring(char *s)
{
   int len = strlen(s);
   int i = 0, j = 1, k = 0;
   while(i<len && j<len && k<len)
   {
       int t=s[(i+k)%len]-s[(j+k)%len];
       if(t==0)
           k++;
       else
       {
           if(t > 0)
               j+=k+1;
           else
               i+=k+1;
           if(i==j) j++;
           k=0;
       }
   }
   return min(i,j);
}

上例题

String Problem

HDU-3374
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 3
LONGSKY 4
ONGSKYL 5
NGSKYLO 6
GSKYLON 7
and lexicographically first of them is GSKYLON, lexicographically last is YLONGSK, both of them appear only once.
Your task is easy, calculate the lexicographically first string’s Rank (if there are multiple answers, choose the smallest one), its times, lexicographically last string’s Rank (if there are multiple answers, choose the smallest one), and its times also.

Input

Each line contains one line the string S with length N (N <= 1000000) formed by lower case letters.

Output

Output four integers separated by one space, lexicographically fisrt string’s Rank (if there are multiple answers, choose the smallest one), the string’s times in the N generated strings, lexicographically last string’s Rank (if there are multiple answers, choose the smallest one), and its times also.

Sample Input

abcder
aaaaaa
ababab

Sample Output

1 1 6 1
1 6 1 6
1 3 2 3

题意

输出所给字符串的最大最小表示的起始位置和数量!

思路

我们可以用最大最小的公用模板求出位置,然后用kmp求出个数

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define MAXN 1000017
int Next[MAXN];
char str[MAXN];
int k;
void getNext( char T[],int len)
{
    int i = 0, j = -1;
    Next[0] = -1;
    while(i < len)
    {
        if(j == -1 || T[i] == T[j])
        {
            i++,j++;
            Next[i] = j;
        }
        else
            j = Next[j];
    }
}
int get_minstring(char *s)
{
    int len = strlen(s);
    int i = 0, j = 1, k = 0;
    while(i<len && j<len && k<len)
    {
        int t=s[(i+k)%len]-s[(j+k)%len];
        if(t==0)
            k++;
        else
        {
            if(t > 0)
                i+=k+1;
            else
                j+=k+1;
            if(i==j) j++;
            k=0;
        }
    }
    return min(i,j);
}
int get_maxstring(char *s)
{
    int len = strlen(s);
    int i = 0, j = 1, k = 0;
    while(i<len && j<len && k<len)
    {
        int t=s[(i+k)%len]-s[(j+k)%len];
        if(t==0)
            k++;
        else
        {
            if(t > 0)
                j+=k+1;
            else
                i+=k+1;
            if(i==j) j++;
            k=0;
        }
    }
    return min(i,j);
}
int main()
{
    while(scanf("%s",str)!=EOF)
    {
        int len = strlen(str);
        getNext(str,len);
        int tt = len - Next[len];
        int num = 1;
        if(len%tt == 0)
        {
            num = len/tt;
        }
        int posmin = get_minstring(str);
        int posmax = get_maxstring(str);
        printf("%d %d %d %d\n",posmin+1,num,posmax+1,num);
    }
    return 0;
}

如有不对的地方欢迎指正。

白盒测试逻辑覆盖之谓词覆盖、子句覆盖、三类有效字句覆盖等知识点 本篇笔记会简化书本上的概念,用容易理解的方式来说明,有些例子打字麻烦,我会直接放图片! 目录 基础知识: 谓词覆盖predicate coverage 子句覆盖 clause coverage 组合覆盖 combinatorial coverage 有效字句覆盖Active Clause Coverage 广义有效子句覆盖(General Active Clause Coverage) 相关性有效子句覆盖(Correlated Active Clause Coverage) 限制性有效 阅读详情

相关推荐

Visual Studio Installer下载失败的5种修复方法(含DNS修改/补丁安装)

本文针对Visual Studio Installer下载安装文件失败的问题,提供了从网络层到系统层的深度排查与修复指南。详细介绍了DNS修改、代理配置、防火墙设置、系统服务检查等5种核心修复方法,并包含离线安装与手动补丁等替代方案,帮助开发者彻底解决安装难题。

sprite的博客 1618

【字符串】最小表示法

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

文艺倾年的博客 1176

统信UOS系统盘空间不足?5分钟搞定扩容的图形化解决方案

本文提供统信UOS系统盘空间不足的图形化扩容解决方案,使用GParted分区编辑器在不丢失数据的情况下快速完成扩容。详细步骤包括准备工作、空间调整和执行验证,适合技术用户快速解决问题。

d6e7f8的博客 956

字符串的最大最小表示

又是要求循环字符串中最小字典序的串的位置,和最大字典序的串的位子 int Min_or_Max(bool Min,int len) { int i = 0, j = 1, k = 0, sub = 0; while (i { sub = str[(i + k) % len] - str[(j + k) % len]; if (sub == 0) k++; else { if

ACM之梦 841

保姆级教程:从零到飞,用QGC地面站搞定PX4无人机全流程配置(含避坑指南)

本文提供了一份详细的QGC地面站使用教程,指导用户从零开始配置PX4无人机,涵盖固件烧录、传感器校准、遥控器设置及航点规划等关键步骤,并包含实用的避坑指南,帮助新手顺利完成首飞。

weixin_30329623的博客 221

ALTERA MAX10 FPGA 串口远程升级实战:从原理到烧录的避坑指南

本文详细解析了ALTERA MAX10 FPGA如何通过串口实现远程升级。文章从工程师实战经验出发,深入剖析了MAX10片内Flash的双镜像备份原理、CONFIG_SEL引脚启动机制,并重点介绍了使用On-Chip Flash IP核进行擦写操作的核心流程。同时,提供了从Quartus工程配置、RPD文件生成、串口协议设计到驱动代码编写的完整避坑指南,旨在帮助开发者稳定、高效地完成远程升级功能部署。

weixin_29197699的博客 273

最小表示法总结+例题

给一个字符串,如果这个字符串是环状的,它的字典序最小的表示方法是什么。 O(n)算法 与kmp相似,都是相同的不再比较。 i和j为两个不同的起点引领的长度为k的字符串 int n=strlen(s+1); for(int i=1;i<=n;i++) { s[n+i]=s[i]; } int i=1,j=2,k; while(i<=n&&j<=n) { ...

weixin_43819578的博客 691

UE4游戏开发:GameInstance与GameMode的实战应用与避坑指南

本文深入解析了UE4中GameInstance与GameMode的核心差异与实战应用。GameInstance作为贯穿游戏进程的全局单例,负责跨关卡数据持久化与系统管理;而GameMode则定义特定关卡内的游戏规则与逻辑,随关卡加载销毁。文章通过数据存储、动态模式切换及网络游戏等场景,提供了清晰的应用指南与常见避坑方案,帮助开发者构建更健壮的UE4游戏架构。

kubernetes8ctl的博客 230

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

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

wxy2635618879的博客 1469

新版ThingsBoard 4.2.0在windows上用IDEA编译记录

编译thingsboard4.2.0在windows上使用Idea

hssjf的专栏 1482

uniapp - 详细解决 H5 网页报错 Uncaught Error: Async component timed out after ? ms.(移动端h5页面白屏或加载缓慢失败,超时报错处理)

uni-app,vue3,网页,h5,移动端,手机H5页面,浏览器,报错,uniapp报错,Asynccomponenttimedoutafter,如何解决这个问题,vue3Asynccomponenttimedoutafter,异步组件超时了怎么办,async,详细解决方案,AsyncComponents异步组件,导致页面打不开了,白屏什么也不显示,网页载入非常慢卡顿,vue3网站报错,超时,nuxt3,详细解决方案,浏览器控制台报错,爆红并且页面卡住了,依旧报错,找不到异步组件的报错

🏆 前端领域优质创作者 3776

HDU 3374 String Problem(最大最小表示法 模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374Problem DescriptionGive you a string with length N, you can generate N strings by left shifts. For example let consider the string “SKYLONG”, we can ...

1670

12027.linux flash驱动之IS25LP01G/IS25WWP01G

一页:512字节 --> 扇区 4096字节 --> 块 32k,64k, 层层递进关系。

写给自己的笔记 2289

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

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

没有梦想何以远行 235

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

hdu 3374 String Problem (最大最小表示法)

http://acm.hdu.edu.cn/showproblem.php?pid=3374 SKYLONG 1 KYLONGS 2 YLONGSK 3 LONGSKY 4 ONGSKYL 5 NGSKYLO 6 GSKYLON 7 题意:输出的是最小字典序的编号,最小字典序个数,最大字典序编号,最大字典序个数 求有几个这样的字符串直接Kmp求得next数组就ok了, 然后

大太阳 786

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

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

HDU 3374 String Problem(最小表示法·KMP)

题意  给你一个环形串  输出其最小表示法的首字母位置  最大表示法的首字母位置  以及和对应位置等价位置的个数 最小表示法指一个循环串以某一位开始时对应的串的字典序最小  这个串就是该循环串的最小表示法  先看一下求字符串最小表示法的过程  可以看2003年国家集训队论文集中周源的论文 令 p 表示字符串 s 的最小表示法的下标,  l = strlen(s)  s = s + s

Deng's site \# 1311

N - String Problem HDU - 3374(最大最小表示法模板)

String Problem HDU - 3374 题意:给你一个字符串,让你求他的循环串的最大最小的位置,以及出现次数。 分析:出现次数很好求了,你可想如果最大最小出现多次即存在循环串,才有可能有多个最大最小。然后就是最大最小表示法的模板存一下。 #include <iostream> #include <cstdio> #include <stack&g...

fighting_yifeng的博客 262

HDU 3374 String Problem (KMP+最大最小表示)

转载请注明出处,谢谢http://blog.youkuaiyun.com/acm_cxlove/article/details/7854526       by---cxlove 题目:输出最大最小表示是从哪一位开始,而且输出数量 http://acm.hdu.edu.cn/showproblem.php?pid=3374  数量好求,肯定是字符串的循环节,循环节可以直接通过KMP的Next数组得到

窝不是爱酱,喵~~~~ 4294

HDU-3374-String Problem(最小表示法, KMP)

链接: https://vjudge.net/problem/HDU-3374 题意: 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 string...

weixin_30294021的博客 204

hdu 3374 String Problem(KMP + 最小串)

题目链接:hdu 3374 String Problem 题目大意:给出一个,字符串,每次将最前一个字符放到最后,知道形成一周,然后按照每个字符串出现的先后排个名次,现在要求求出字典序最小的字符串和字典序最大的字符串为RANK几。并输出它们的出现次数,如果出现次数不只一次,那么输出RANK值较小的。 解题思路:KMP中的求最小串,然后用最小串去原字符串中求匹配数量。

不慌不忙、不急不躁 1422

HDU 3374 String Problem(最大最小表示法+kmp)

Time Limit:1000MS Memory Limit:32768KBDescription 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 s

2cm的专栏 490

HDU - 3374 String Problem 最小最大表示法+循环节

题目链接:https://cn.vjudge.net/problem/HDU-3374 题意:向左移动【0, len-1】次,形成的n个串,求最小和最大串的起始位置,和有多少个 题解:求数目的话,直接找最小循环节即可,最小最大串位置直接最大最小表示法找就可以了。 #include <bits/stdc++.h> using namespace std; const int N ...

还我笑颜 253

HDU 3374 String Problem (字符串最小表示法+KMP)

String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4951    Accepted Submission(s): 2014   Problem Description Give you a string ...

LSD20164388的博客 336

【代码超详解】HDU 3374 String Problem(最小 / 最大表示法 + KMP 求最小循环节长度,109 ms)

一、题目描述 二、算法分析说明与代码编写指导 最小表示法 KMP 三、AC 代码 法一(468 ms): #include<cstdio> #include<algorithm> #include<cstring> #pragma warning(disable:4996) using namespace std; template<class _Ty...

COFACTOR 245
上一篇: 字典树学习
下一篇: 对我影响极大的几位老师
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值