今天又在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. Python Ast介绍及应用

    Abstract Syntax Trees即抽象语法树.Ast是python源码到字节码的一种中间产物,借助ast模块可以从语法树的角度分析源码结构.此外,我们不仅可以修改和执行语法树,还可以将Sou ...

  2. 配置CLion作为Qt5开发环境

    使用Qt进行程序开发时QtCreator总是不二之选.作为老牌IDE在提供了强大的功能同时也对Qt的支持做了许多优化.如果没有特别的原因你应该使用它. 然而一个顺手的工具将会极大得提升生产效率,而如果 ...

  3. (转载)IQueryable和IEnumerable

    第一篇:https://www.cnblogs.com/zgqys1980/p/4047315.html: 第二篇:https://www.cnblogs.com/shenbing/p/5394228 ...

  4. JQ的.serialize()

    前面写的都是用Form表单提交,但是VUE.JS好像不能控制Form的Action. 于是就用AJAX来提交,但是跳转地址(window.location.href=)会暴露数据在url上,就直接用s ...

  5. 用Gogs在Windows上搭建Git服务

    1.下载并安装Git,如有需求,请重启服务器让Path中的环境变量生效. 2.下载并安装Gogs,请注意,在Windows中部署时,请下载MiniWinService(mws)版本. 3.在Maria ...

  6. K3日志定时备份

    K3日志超过5万条以后,每次用户登陆后,系统都会提示日志太多.但是日志又不能随意删除,所以需要做个数据库定时任务,定时把日志转移到备份表. declare @dt datetime;; SELECT ...

  7. ASP.NET学习笔记 —— 一般处理程序之图片上传

    简单图片上传功能目标:实现从本地磁盘读取图片文件,展示到浏览器页面.步骤:(1). 首先创建一个用于上传图片的HTML模板,命名为ImageUpload.html: <!DOCTYPE html ...

  8. 订制rpm包到Centos7镜像中

    本文以CentOS 7.4 最小化镜像(CentOS-7-x86_64-Minimal-1708.iso)为模版 要达到的目的: 1.订制所需的rpm软件包集成到iso文件中 2.制作完成的ISO全自 ...

  9. 记录Javascript的数据方法参考

    concat >>连接2个或更多数组,并返回结果 var arr1 = [1,2,3]; var arr2 = [-1,-2,-3]; console.log(arr1.concat(ar ...

  10. Web前端教程3-JavaScript教程

    目录 1. JavaScript介绍 1.1. JS嵌入页面的方式 2. JS基本语法 2.1. 变量类型 2.2. 获取元素方法 2.3. 操作元素属性 2.4. innerHTML的使用 3. J ...