今天又在lyk大佬的博客学会了——最小表示法(异常激动
发篇题解纪念一下
说在前面:给luogu提个建议最小表示法的题太少了,都被hdu抢去了!!!



我们先看一下题目

看完后可以用一个字概括——,两个字——懵逼

在这里我提供题目大意:

输出最大和最小的是从哪一位开始的,同时输出最小循环节的个数。

由于本人懒于写字符串最小表示法,那么我们就来借鉴一下lykkk优秀总结

看完之后,显然我们就明白了许多

因为题目中让我们同时求出最大和最小的起始位置

所以我们不仅要来一遍最小表示法,还要来一遍最大表示法

其实这两种算法唯一的区别就是:

最小表示法中当str[i+k]>str[j+k]时,i+k的字典序比j+k的字典序大,那么我们就要抛弃当前以i为头的字符串,往后走即i+=k+1

最大表示法就是当str[i+k]<str[j+k]时,我们才要更新起点

各来一遍后,题目就完成了一半

至于KMP在这里的作用就是,利用next数组来求循环节,则次数=长度/循环节长度

说到这里,显然三个子函数足以解决这个问题了

我们最后只需要在主函数里根据题意输入输出即可

无代码,不成方圆

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n;
char s[N];
int nxt[N];
void Kmp(int l){//用来求最小循环节的个数
int j=,k=nxt[]=-;
while(j<l){
if(k==- || s[j]==s[k]) nxt[++j]=++k;
else k=nxt[k];
}
}
int Min(char s[],int l){
int i=,j=,k=;
while(i<l && j<l && k<l){
if(s[(i+k)%l]==s[(j+k)%l]) k++;
else if(s[(i+k)%l]>s[(j+k)%l]) i+=k+,k=;
else j+=k+,k=;
if(i==j) i++;
}
return min(i,j);
}
int Max(char s[],int n){
int i=,j=,k=;
while(i<n && j<n && k<n){
if(s[(i+k)%n]==s[(j+k)%n]) k++;
else if(s[(i+k)%n]<s[(j+k)%n]) i+=k+,k=;//唯一的区别
else j+=k+,k=;
if(i==j) i++;
}
return min(i,j);
}
int main(){//常规操作
while(scanf("%s",s)!=EOF){
int len=strlen(s);
Kmp(len);
int maxn=Max(s,len),minn=Min(s,len);
printf("%d %d %d %d\n",minn+,len/(len-nxt[len]),maxn+,len/(len-nxt[len]));
}
return ;
}

完结,撒花!

hdu P3374 String Problem的更多相关文章

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

    HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory ...

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

    String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  3. hdu 5772 String problem 最大权闭合子图

    String problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5772 Description This is a simple pro ...

  4. hdu 3374 String Problem(kmp+最小表示法)

    Problem Description Give you a string with length N, you can generate N strings by left shifts. For ...

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

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3374 [题目大意] 给出一个字符串,求出最小和最大表示是从哪一位开始的,并且输出数量. [题解] ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:给出一个字符串,依次左移一个单位形成一堆字符串,求其字典序最小和最大的字符串需要左移多 ...

  7. HDU - 3374:String Problem (最小表示法模板题)

    Give you a string with length N, you can generate N strings by left shifts. For example let consider ...

  8. hdu 3374 String Problem (kmp+最大最小表示法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:输出最大和最小的是从哪一位开始的,同时输出最小循环节的个数. 这里简单介绍对字符串最小 ...

  9. hdu 3374 String Problem(最小表示法+最大表示法+kmp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题意:给出一个字符串问这个字符串最小表示的最小位置在哪,还有有几个最小表示的串.最大表示的位置在 ...

随机推荐

  1. SLAM+语音机器人DIY系列:(八)高阶拓展——1.miiboo机器人安卓手机APP开发

    android要与ROS通讯,一种是基于rosbridge,另一种是基于rosjava库. 相关参考例子工程 rosbridge例子: https://github.com/hibernate2011 ...

  2. 进阶!基于CentOS7系统使用cobbler实现单台服务器批量自动化安装不同版本系统(week3_day5_part2)-技术流ken

    前言 在上一篇博文<cobbler批量安装系统使用详解-技术流ken>中已经详细讲解了cobbler的使用以及安装,本篇博文将会使用单台cobbler实现自动化批量安装不同版本的操作系统. ...

  3. ado.net的简单数据库操作(三)——简单增删改查的实际应用

    果然,在犯困的时候就该写写博客,写博客就不困了,哈哈! 上篇我记录了自己的SqlHelper的开发过程,今天记录一下如何使用这个sqlhelper书写一个具有简单增删改查的小实例啦. 实例描述:在数据 ...

  4. ASP.NET Core的JWT的实现(自定义策略形式验证).md

    既然选择了远方,便只顾风雨兼程 __ HANS许 在上篇文章,我们讲了JWT在ASP.NET Core的实现,基于中间件来实现.这种方式有个缺点,就是所有的URL,要嘛需要验证,要嘛不需要验证,没有办 ...

  5. 阿里、百度等多家公司Java面试记录与总结

    算算自己大概面试了近十家公司,也拿到了几个Offer,现在面试告一段落,简单总结下面试经验. 我现在主要的方向是Java服务端开发,把遇到的问题和大家分享一下,也谈谈关于技术人员如何有方向的提高自己, ...

  6. linux下载服务器上的文件命令-sz

    语法:sz  文件 比如要下载下面这个com.zip这个压缩包 输入sz com.zip 弹出下载页面,即可开始下载文件

  7. Java学习点滴——初识Java

    基于<Java编程思想>第四版 前言 "程序就是算法加数据结构",而算法就是控制语句加操作符,编写一个程序就是使用控制语句加操作符去操作数据结构,因此我从Java的控制 ...

  8. 授权管理-LDAP-介绍与环境搭建

    LDAP介绍 转自:https://blog.csdn.net/tanshizhen119/article/details/79942315 还是先来百度百科介绍. LDAP是轻量目录访问协议,英文全 ...

  9. js将一个数组分成多个数组

    1,将数组array分成长度为subGroupLength的小数组并返回新数组 function group(array, subGroupLength) { let index = 0; let n ...

  10. MySQL分组查询与连接查询

    一,分组查询 使用ORDER BY子句将表中的数据分成若干组(还是按行显示) 语法: SELECT 字段名[,聚集函数] FROM 表名 [WHERE子句] GROUP BY 要分组的字段名 [ORD ...