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+最大最小表示)相关推荐

  1. hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)

    Problem - 3374 KMP求循环节. http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html 循环节推导的证明相当的好,这 ...

  2. HDU - 3374 String Problem(最小表示法+最大表示法+KMP的next数组)

    题目链接:点击查看 题目大意:给出一个字符串,现在问字符串不断向左循环所能形成的n个字符串中,字典序最小和最大的字符串的编号为多少,分别有多少个 题目分析:字符串最小表示法的模板题,证明和模板都是看大 ...

  3. hdu P3374 String Problem

    今天又在lyk大佬的博客学会了--最小表示法(异常激动 发篇题解纪念一下 说在前面:给luogu提个建议最小表示法的题太少了,都被hdu抢去了!!! 我们先看一下题目 看完后可以用一个字概括--蒙,两 ...

  4. hdu 3374 String Proble

    kmp+最小表示法 #include<iostream> #define maxn 1000010 using namespace std; string str; int nextt[m ...

  5. HDU 3374 最小 / 大表示法

    题意 传送门 HDU 3374 String Problem 题解 求字符串中字典序最小与最大的循环同构串,并求解对应的起始字符在原字符串中出现的位置最早的一个,以及这个循环同构串出现的次数. 最小/ ...

  6. hdu 5008 Boring String Problem(后缀数组+rmq)

    题目链接:hdu 5008 Boring String Problem 题意: 给你一个字符串,有q个询问,每次询问该字符串所有的子串中字典序第k小的是哪个串,输出位置,如果有多个位置,输出最靠左的那 ...

  7. HDU 5008 Boring String Problem ( 后缀数组求本质不同第k大子串)

    Boring String Problem Zeronera题解 预处理sum数组记录不同字符串的个数,即sum[i] = n- sa[i] + 1 -height[i] + sum[i-1] (n为 ...

  8. M - Mediocre String Problem( 扩展KMP + Manacher + 差分 )

    M - Mediocre String Problem( 扩展KMP + Manacher + 差分 ) 题意:给出一个串S,和一个串T. 要求 从S串中取一个子串,后面接上T串的一个前缀 组成一个结 ...

  9. Mediocre String Problem(马拉车+扩展KMP)

    文章目录 [Mediocre String Problem](https://codeforces.com/gym/101981) 题目大意 解题思路 代码 Mediocre String Probl ...

最新文章

  1. 各版本mysql乱码的问题解决(转)
  2. Caffe代码导读(2):LMDB简介
  3. Ubuntu安装screen
  4. VTK:RT 分析源用法实战
  5. 折线分割平面[HDU2050]
  6. NoClassDefFoundError: org/apache/flink/metrics/MetricGroup
  7. 【地理建模】现代地理学中的数学方法:主成分分析法案例详解
  8. Ajax ControlToolkit - AnimationExtender Action语法(笔记)
  9. 在服务端合并和压缩JavaScript和CSS文件[转]
  10. oracle内连接左连接右连接,ORACLE 左连接 右连接 内连接 区别
  11. 关于“墨者安全专家3.7”不得不说的事情
  12. 0字节文件无法删除怎么办
  13. 不断下沉的咖啡业,是虚假的繁荣还是破局的前夜?
  14. shell之正则表达式及grep命令
  15. 360浏览器下载文件时二次提交请求
  16. vue antvG6 绘制组织架构图
  17. 常用的校验注解之 @NotNull、@NotBlank、@NotEmpty 的区别
  18. 一个有意思的404页面
  19. C模板:十进制和十六进制数据批量转换
  20. java 获取主机名时报java.net.UnknownHostException

热门文章

  1. Sum-product Networks
  2. 编写和布置一个List Event Receivers(下)
  3. Netlib文件转化为mps文件
  4. zabbix监控超详细搭建过程
  5. Android开发之Mediaplayer
  6. Sql 2008 安装遇到的问题
  7. silverlight中的socket编程注意事项
  8. 现在不坚持,以后都会放弃
  9. 网页效果图设计之色彩索引
  10. spring3.0设置定时任务