HDU 3374 String Problem (KMP+最大最小表示)
KMP,在有循环节的前提下: 循环节 t = len-next[len], 个数num = len/(len-next[len]);
个人理解,如果有循环节,循环节长度必定小于等于len/2, 换句话说next[len]>=len/2;
对于len%(len-next)!=0的这种情况不讨论,循环节不存在。
下面是假设循环节存在的情况
当次数等于2, 对于abcabc这种情况就不用说了,len = 6, next[len] = 3;
当次数大于2,
对于串a1 a2 a3 a4 a5 a6 a7 a8 a9
如果有
a1 a2 a3 a4 a5 a6
a4 a5 a6 a7 a8 a9
next[len] = 6, len = 9;
说明a7 a8 a9 = a4 a5 a6;
a1 a2 a3 = a4 a5 a6;
循环节就很明显了,其它情况也是类似与这样讨论。
所以。。。。。
view code#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 1e6+10; char s[N]; int next[N];void getnext(char *s, int *next, int len) {int j=0, i=1;next[1] = 0;while(i<len){if(j==0 || s[i]==s[j]) next[++i] = ++j;else j = next[j];} }int getsub(char *s, bool flag, int len) {int i = 0, j = 1, k = 0;while(i<len && j<len && k<len){if(i==j) j++;int ni = i+k, nj = j+k;if(ni>=len) ni -= len;if(nj>=len) nj -= len;if(s[ni]>s[nj]){if(flag) i += k+1;else j += k+1;k = 0;}else if(s[ni]<s[nj]){if(flag) j+= k+1;else i+= k+1;k = 0;}else k++;}return i; }int main() {while(scanf("%s", s)>0){int len = strlen(s);getnext(s, next, len);int t = len-next[len];t = (len%t?1:len/t);int minsub = getsub(s, true, len)+1;int maxsub = getsub(s, false, len)+1;printf("%d %d %d %d\n",minsub, t, maxsub, t);} }
转载于:https://www.cnblogs.com/zyx1314/p/3896582.html
HDU 3374 String Problem (KMP+最大最小表示)相关推荐
- hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)
Problem - 3374 KMP求循环节. http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html 循环节推导的证明相当的好,这 ...
- HDU - 3374 String Problem(最小表示法+最大表示法+KMP的next数组)
题目链接:点击查看 题目大意:给出一个字符串,现在问字符串不断向左循环所能形成的n个字符串中,字典序最小和最大的字符串的编号为多少,分别有多少个 题目分析:字符串最小表示法的模板题,证明和模板都是看大 ...
- hdu P3374 String Problem
今天又在lyk大佬的博客学会了--最小表示法(异常激动 发篇题解纪念一下 说在前面:给luogu提个建议最小表示法的题太少了,都被hdu抢去了!!! 我们先看一下题目 看完后可以用一个字概括--蒙,两 ...
- hdu 3374 String Proble
kmp+最小表示法 #include<iostream> #define maxn 1000010 using namespace std; string str; int nextt[m ...
- HDU 3374 最小 / 大表示法
题意 传送门 HDU 3374 String Problem 题解 求字符串中字典序最小与最大的循环同构串,并求解对应的起始字符在原字符串中出现的位置最早的一个,以及这个循环同构串出现的次数. 最小/ ...
- hdu 5008 Boring String Problem(后缀数组+rmq)
题目链接:hdu 5008 Boring String Problem 题意: 给你一个字符串,有q个询问,每次询问该字符串所有的子串中字典序第k小的是哪个串,输出位置,如果有多个位置,输出最靠左的那 ...
- HDU 5008 Boring String Problem ( 后缀数组求本质不同第k大子串)
Boring String Problem Zeronera题解 预处理sum数组记录不同字符串的个数,即sum[i] = n- sa[i] + 1 -height[i] + sum[i-1] (n为 ...
- M - Mediocre String Problem( 扩展KMP + Manacher + 差分 )
M - Mediocre String Problem( 扩展KMP + Manacher + 差分 ) 题意:给出一个串S,和一个串T. 要求 从S串中取一个子串,后面接上T串的一个前缀 组成一个结 ...
- Mediocre String Problem(马拉车+扩展KMP)
文章目录 [Mediocre String Problem](https://codeforces.com/gym/101981) 题目大意 解题思路 代码 Mediocre String Probl ...
最新文章
- 各版本mysql乱码的问题解决(转)
- Caffe代码导读(2):LMDB简介
- Ubuntu安装screen
- VTK:RT 分析源用法实战
- 折线分割平面[HDU2050]
- NoClassDefFoundError: org/apache/flink/metrics/MetricGroup
- 【地理建模】现代地理学中的数学方法:主成分分析法案例详解
- Ajax ControlToolkit - AnimationExtender Action语法(笔记)
- 在服务端合并和压缩JavaScript和CSS文件[转]
- oracle内连接左连接右连接,ORACLE 左连接 右连接 内连接 区别
- 关于“墨者安全专家3.7”不得不说的事情
- 0字节文件无法删除怎么办
- 不断下沉的咖啡业,是虚假的繁荣还是破局的前夜?
- shell之正则表达式及grep命令
- 360浏览器下载文件时二次提交请求
- vue antvG6 绘制组织架构图
- 常用的校验注解之 @NotNull、@NotBlank、@NotEmpty 的区别
- 一个有意思的404页面
- C模板:十进制和十六进制数据批量转换
- java 获取主机名时报java.net.UnknownHostException