hdu P3374 String Problem
今天又在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的更多相关文章
- HDU 3374 String Problem (KMP+最大最小表示)
HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others) Memory ...
- HDU 3374 String Problem(KMP+最大/最小表示)
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 5772 String problem 最大权闭合子图
String problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5772 Description This is a simple pro ...
- hdu 3374 String Problem(kmp+最小表示法)
Problem Description Give you a string with length N, you can generate N strings by left shifts. For ...
- HDU 3374 String Problem (KMP+最小最大表示)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3374 [题目大意] 给出一个字符串,求出最小和最大表示是从哪一位开始的,并且输出数量. [题解] ...
- HDU 3374 String Problem(KMP+最大(最小)表示)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:给出一个字符串,依次左移一个单位形成一堆字符串,求其字典序最小和最大的字符串需要左移多 ...
- HDU - 3374:String Problem (最小表示法模板题)
Give you a string with length N, you can generate N strings by left shifts. For example let consider ...
- hdu 3374 String Problem (kmp+最大最小表示法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:输出最大和最小的是从哪一位开始的,同时输出最小循环节的个数. 这里简单介绍对字符串最小 ...
- hdu 3374 String Problem(最小表示法+最大表示法+kmp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题意:给出一个字符串问这个字符串最小表示的最小位置在哪,还有有几个最小表示的串.最大表示的位置在 ...
随机推荐
- 一个tomcat设置多个端口,多个端口对应多个应用
修改tomcat/conf目录里面server.xml文件 例如下面这样新增一个8090端口,设置下appBase目录,这样就可以用一个tomcat监听多个端口,每个端口都可以放应用了.我这样新增下面 ...
- nginx系列10:通过upstream模块选择上游服务器和负载均衡策略round-robin
upstream模块的使用方法 1,使用upstream和server指令来选择上游服务器 这两个指令的语法如下图: 示例: 2,对上游服务使用keepalive长连接 负载均衡策略round-rob ...
- SpringAOP(5)
2019-03-08/14:22:58 演示:登陆核心业务类与日志周边功能实现AOP面向切面思想 jar包:https://share.weiyun.com/5GOFouP 学习资料:http://h ...
- 中文代码示例之5分钟入门TypeScript
"中文编程"知乎专栏原文 Typescript官方文档起的这个噱头名字: TypeScript in 5 minutes, 虽然光看完文章就不止5分钟...走完整个文档流水账如下( ...
- Visual Studio插件开发基础
Visual Studio插件主要有两种:Add-in 和 VSX(Visual Studio eXtensibility) 两者区别可参考这篇文章:Visual Studio Extensions ...
- hbase snapshot 表备份/恢复
snapshot其实就是一组metadata信息的集合,它可以让管理员将表恢复到以前的一个状态.snapshot并不是一份拷贝,它只是一个文件名的列表,并不拷贝数据.一个全的snapshot恢复以为着 ...
- WPF软件开发系统之六——药品管理查询系统
本系统使用.Net WPF开发,运行于Windows操作系统,电脑或者触摸屏设备. 功能主要是药品按照各类条件检索及展示. 开发环境及工具: 首页: 按关键字查询: 按功效查询: 还有其它按拼音.按笔 ...
- 001_python实现数据分析
一. # coding:utf8 # !/usr/bin/python # import numpy as np import pandas as pd import np def example2( ...
- UVA11419 SAM I AM
UVA11419 SAM I AM 给定一个 \(R\times C\) 的矩阵中的 \(N\) 个点,求最少选取多少个行或列才能使得每个给出的点都被一行或一列覆盖,输出方案 \(R,\ C\leq1 ...
- 【新特性速递】FineUIPro/Mvc/Core 全新移动端访问体验(示例首页)!
移动端支持 虽然 FineUIPro 早在 2016 年就已经完成对移动端的适配工作,并新增了 50 多个官网示例. 并且,我们也新增了一个移动端的首页 http://pro.fineui.com/m ...