题面

Hihocoder

Vjudge

Sol

题目的提示说的也非常好

我对求\(LCP(P - L + len \% l, P + len \% L)\)做补充

\(len=LCP(P, P + L)\)

为什么只要求\(LCP(P - L + len \% l, P + len \% L)\)呢?

考虑在\(P - L + len \% l\)右边到\(P\)之间,它不比这里的重复次数大

考虑在\(P - L + len \% l\)左边到\(P-1\)之间,一样的它也是不增的

  1. # include <bits/stdc++.h>
  2. # define IL inline
  3. # define RG register
  4. # define Fill(a, b) memset(a, b, sizeof(a))
  5. using namespace std;
  6. typedef long long ll;
  7. const int _(100010);
  8. int n, a[_], sa[_], rk[_], y[_], height[_], t[_], vis[_];
  9. int st[20][_], lg[_];
  10. char s[_];
  11. IL bool Cmp(RG int i, RG int j, RG int k){ return y[i] == y[j] && y[i + k] == y[j + k]; }
  12. IL void Sort(){
  13. RG int m = 30;
  14. for(RG int i = 1; i <= n; ++i) ++t[rk[i] = a[i]];
  15. for(RG int i = 1; i <= m; ++i) t[i] += t[i - 1];
  16. for(RG int i = n; i; --i) sa[t[rk[i]]--] = i;
  17. for(RG int k = 1; k <= n; k <<= 1){
  18. RG int l = 0;
  19. for(RG int i = n - k + 1; i <= n; ++i) y[++l] = i;
  20. for(RG int i = 1; i <= n; ++i) if(sa[i] > k) y[++l] = sa[i] - k;
  21. for(RG int i = 0; i <= m; ++i) t[i] = 0;
  22. for(RG int i = 1; i <= n; ++i) ++t[rk[y[i]]];
  23. for(RG int i = 1; i <= m; ++i) t[i] += t[i - 1];
  24. for(RG int i = n; i; --i) sa[t[rk[y[i]]]--] = y[i];
  25. swap(rk, y); rk[sa[1]] = l = 1;
  26. for(RG int i = 2; i <= n; ++i) rk[sa[i]] = Cmp(sa[i - 1], sa[i], k) ? l : ++l;
  27. if(l >= n) break;
  28. m = l;
  29. }
  30. for(RG int i = 1, j = 0; i <= n; ++i){
  31. j = max(0, j - 1);
  32. while(a[j + i] == a[sa[rk[i] - 1] + j]) ++j;
  33. height[rk[i]] = j;
  34. }
  35. }
  36. IL int LCP(RG int xx, RG int yy){
  37. xx = rk[xx]; yy = rk[yy];
  38. if(xx > yy) swap(xx, yy);
  39. ++xx;
  40. RG int l = lg[yy - xx + 1];
  41. return min(st[l][xx], st[l][yy - (1 << l) + 1]);
  42. }
  43. IL int Calc(){
  44. RG int ans = 0;
  45. for(RG int l = 1; l <= n; ++l)
  46. for(RG int i = 1; i + l <= n; i += l){
  47. RG int len = LCP(i, i + l);
  48. ans = max(ans, len / l + 1);
  49. if(i >= l - len % l) ans = max(ans, LCP(i - l + len % l, i + len % l) / l + 1);
  50. }
  51. return ans;
  52. }
  53. int main(RG int argc, RG char* argv[]){
  54. scanf(" %s", s + 1);
  55. n = strlen(s + 1);
  56. for(RG int i = 1; i <= n; ++i) a[i] = s[i] - 'a' + 1;
  57. for(RG int i = 2; i <= n; ++i) lg[i] = lg[i >> 1] + 1;
  58. Sort();
  59. for(RG int i = 1; i <= n; ++i) st[0][i] = height[i];
  60. for(RG int i = 1; i <= lg[n]; ++i)
  61. for(RG int j = 1; j + (1 << i) - 1 <= n; ++j)
  62. st[i][j] = min(st[i - 1][j], st[i - 1][j + (1 << (i - 1))]);
  63. printf("%d\n", Calc());
  64. return 0;
  65. }

HiHocoder1419 : 后缀数组四·重复旋律4&[SPOJ]REPEATS:Repeats的更多相关文章

  1. hihocoder-1419 后缀数组四·重复旋律4 求连续重复次数最多的子串

    对于重复次数,如果确定了重复子串的长度len,那重复次数k=lcp(start,start+len)/len+1.而暴力枚举start和len的复杂度是O(n^2),不能接受.而有一个规律,若我们只枚 ...

  2. hiho一下123周 后缀数组四·重复旋律

    后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...

  3. hihocoder #1419 : 后缀数组四·重复旋律4

    #1419 : 后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构 ...

  4. BZOJ 后缀自动机四·重复旋律7

    后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...

  5. hiho一下122周 后缀数组三·重复旋律

    后缀数组三·重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...

  6. hiho一下121周 后缀数组二·重复旋律2

    后缀数组二·重复旋律2 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...

  7. hiho一下120周 后缀数组一·重复旋律

    后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi ...

  8. HDU_1457_后缀自动机四·重复旋律7

    #1457 : 后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成 ...

  9. HihoCoder1403 后缀数组一·重复旋律1

    后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi ...

随机推荐

  1. CentOS6.8配置GO语言开发环境

    Go语言是谷歌2009发布的第二款开源编程语言,Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全.支持并行进程. 鉴于原来越多的开源项 ...

  2. 加快compser install 和update的方法

    加快compser install 和update的方法: 可以进入composer国内镜像里面进行参考 如下是修改composer.json文件来实现(在json配置的最后加上如下代码) " ...

  3. .NET平台开源项目速览(19)Power BI神器DAX Studio

    PowerBI更新频繁,已经有点更不上的节奏,一直在关注和学习中,基本的一些操作大概是没问题,更重要的是注重Power Query,M函数,以及DAX的使用,这才是核心.   上个月研究了DAX的一些 ...

  4. idea 使用debugger技巧

    1,背景 每个开发人员每天都离不开debugger,只要你在编码,就需要调试,作为一个开发快10年的老程序员每天都要写很多代码,当每个人接到任务的时候都会想,这些功能其实很快就能写完,没错,对于写代码 ...

  5. 微信小程序(一)

    开发流程 注册微信小程序并申请微信支付-->制作小程序-->上传并提交审核-->审核通过,小程序上线   开发微信小程序需要准备 企业公众号(被认证)以及申请小程序.微信开发技术.S ...

  6. springMVC,spring,mybatis全注解搭建框架--第一步,让框架跑起来

    自己从事java开发工作也有一年多了,自己却没有亲手搭建一个完整的框架.于是今天自己动手搭建一个,过程中遇到一些问题,倒腾了大半天终于搞定了. 现在给大家分享一下过程,自己也记录下来,以后学习参考使用 ...

  7. Ansible自动化运维笔记2(Ansible的组件介绍)

    1.Ansible Inventory (1)静态主机文件 默认的ansible invetory是/etc/hosts文件,可以通过ANSIBLE_HOSTS环境变量或者通过运行命令的时候加上-i ...

  8. Phpstrom操作git

    1.PHPstrom操作git[上传] 2.提交代码到仓库 2. 3.使用git bash上传代码仓库的代码到远程服务器 代开git bash进入到项目所在的目录,输入命令$  git push .上 ...

  9. redis内存数据库C客户端hiredis API 中文说明

    A)编译安装 make make install (/usr/local) make install PREFIX=$HOME/progs(可以自由指定安装路径) B)同步的API接口 redisCo ...

  10. 【Unity3D】Unity3D开发《我的世界》之二、创建一个立方体

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_02.html 这一篇的内容比较简单,因为所有理论内容都在上一篇中讲到了.但有两点需 ...