今天又在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. [转]Node.js 应用:Koa2 使用 JWT 进行鉴权

    本文转自:https://www.cnblogs.com/linxin/p/9491342.html 前言 在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行 ...

  2. docker daemon 配置文件

    Ubuntu Ubuntu 14.04 配置文件位于 /etc/init/docker.conf Ubuntu 15.04 配置文件位于 /etc/default/docker,修改配置项DOCKER ...

  3. 个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解

    一.依赖倒置(Dependency Inversion Principle) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...

  4. C# 把字符串类型日期转换为日期类型(转载)

    C# 把字符串类型日期转换为日期类型   来源:https://www.cnblogs.com/raincedar/p/7009243.html 方法一:Convert.ToDateTime(stri ...

  5. 最新阿里Java技术面试题,看这一文就够了!

    金三银四跳槽季即将到来,作为 Java 开发者你开始刷面试题了吗?别急,小编整理了阿里技术面试题,看这一文就够了! 阿里面试题目目录 技术一面(基础面试题目) 技术二面(技术深度.技术原理) 项目实战 ...

  6. Java基础-异常、断言

    处理错误 如果Java程序运行期间出现了错误,并且由于出现错误导致某些操作没有完成,程序应该能够返回到一种安全状态,并能够让用户执行一些其他的命令:或者允许用户保存所有操作结果,并以妥善的方式终止程序 ...

  7. php中读取中文文件夹及文件报错

    php读取时出现中文乱码 一般php输出中出现中文乱码我们可用 header ('content:text/html;charset="utf-8"'); php中读取中文文件夹及 ...

  8. WordCount结对编程

    合作者:201631062602,201631062114 代码地址:https://gitee.com/Changyu-Guo/pairing_project 作业链接:https://www.cn ...

  9. ORACLE复制表结构

    一般网上的方法: ; --复制表结构以及数据按where条件查询出的数据 ; --只复制表结构 但是上面的语法不会复制旧表的默认值.注释.键和索引,因此想要完美的复制表结构就需要先找到旧表的sql语句 ...

  10. Linux(Manjaro) -Docker 安装及基本配置

    Linux(Manjaro) -Docker 安装及基本配置 基本安装 # Pacman 安装 Docker sudo pacman -S docker # 启动docker服务 sudo syste ...