建立后缀数组,遍历height数组找到连续大于len的最长子序列~

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e7+;
  4. char s[maxn];
  5. int n;
  6. int rk[maxn];
  7. int sa[maxn];
  8. int height[maxn];
  9. int tmp[maxn];
  10. int c[maxn];
  11. int t1[maxn];
  12. int t2[maxn];
  13. void build_sa (char s[],int n,int m) {
  14. int i,j,p;
  15. int *x=t1;
  16. int *y=t2;
  17. for (i=;i<m;i++) c[i]=;
  18. for (i=;i<n;i++) c[x[i]=s[i]]++;
  19. for (i=;i<m;i++) c[i]+=c[i-];
  20. for (i=n-;i>=;i--) sa[--c[x[i]]]=i;
  21. for (j=;j<=n;j<<=) {
  22. p=;
  23. for (i=n-j;i<n;i++) y[p++]=i;
  24. for (i=;i<n;i++) if (sa[i]>=j) y[p++]=sa[i]-j;
  25. for (i=;i<m;i++) c[i]=;
  26. for (i=;i<n;i++) c[x[y[i]]]++;
  27. for (i=;i<m;i++) c[i]+=c[i-];
  28. for (i=n-;i>=;i--) sa[--c[x[y[i]]]]=y[i];
  29. swap(x,y);
  30. p=;
  31. x[sa[]]=;
  32. for (i=;i<n;i++)
  33. x[sa[i]]=y[sa[i-]]==y[sa[i]]&&y[sa[i-]+j]==y[sa[i]+j]?p-:p++;
  34. if (p>=n) break;
  35. m=p;
  36. }
  37. }
  38. void getHeight (char s[],int n) {
  39. int i,j,k=;
  40. for (i=;i<=n;i++) rk[sa[i]]=i;
  41. for (i=;i<n;i++) {
  42. if (k) k--;
  43. j=sa[rk[i]-];
  44. while (s[i+k]==s[j+k]) k++;
  45. height[rk[i]]=k;
  46. }
  47. }
  48. int main () {
  49. int len;
  50. scanf ("%d",&len);
  51. getchar ();
  52. cin.getline (s,maxn);
  53. n=strlen(s);
  54. build_sa (s,n+,);
  55. getHeight (s,n);
  56. int cnt=;
  57. int res=;
  58. int ans=;
  59. for (int i=;i<=n;i++) {
  60. if (height[i]>=len) ans++;
  61. else ans=;
  62. if (sa[i]+len<=n&&cnt<ans) {
  63. cnt=ans;
  64. res=sa[i];
  65. }
  66. }
  67. for (int i=;i<len;i++)
  68. printf ("%c",s[res+i]);
  69. printf (" %d",cnt);
  70. return ;
  71. }

PAT T1005 Programming Pattern的更多相关文章

  1. PAT TOP 1005 Programming Pattern (35 分)哈希做法

    1005 Programming Pattern (35 分) Programmers often have a preference among program constructs. For ex ...

  2. PAT (Top Level) Practise 1005 Programming Pattern (35)

    后缀数组.排序之后得到height数组,然后从上到下将height>=len的都分为一组,然后找到第一组个数最多的输出即可. #pragma comment(linker, "/STA ...

  3. Game Programming Pattern

    http://gameprogrammingpatterns.com/contents.html

  4. lazy ideas in programming

    lazy形容词,懒惰的,毫无疑问是一个贬义词.但是,对于计算机领域,lazy却是非常重要的优化思想:把任务推迟到必须的时刻,好处是避免重复计算,甚至不计算.本文的目的是抛砖引玉,总结一些编程中的laz ...

  5. lazy ideas in programming(编程中的惰性思想)

    lazy形容词,懒惰的,毫无疑问是一个贬义词.但是,对于计算机领域,lazy却是非常重要的优化思想:把任务推迟到必须的时刻,好处是避免重复计算,甚至不计算.本文的目的是抛砖引玉,总结一些编程中的laz ...

  6. Linux System Programming 学习笔记(七) 线程

    1. Threading is the creation and management of multiple units of execution within a single process 二 ...

  7. PAT甲级——1025 PAT Ranking

    1025 PAT Ranking Programming Ability Test (PAT) is organized by the College of Computer Science and ...

  8. Awesome Go

    A curated list of awesome Go frameworks, libraries and software. Inspired by awesome-python. Contrib ...

  9. Go 语言相关的优秀框架,库及软件列表

    If you see a package or project here that is no longer maintained or is not a good fit, please submi ...

随机推荐

  1. 概率dp 期望 逆推

    题目大意: 从起点0点开始到达点n,通过每次掷色子前进,可扔出1,2,3,4,5,6这6种情况,扔到几前进几,当然对应飞行通道可以通过x直达一点y,x<y,计算到达n点或超过n 点要扔色子的次数 ...

  2. java.lang.OutOfMemoryError: GC overhead limit exceeded异常处理

    今天写程序遇到个之前从没遇到的异常-----java.lang.OutOfMemoryError: GC overhead limit exceeded,下面附上解决方法 异常: 解决方法: 鼠标右击 ...

  3. RPA_播放语音

    验证码识别 from rpa.captcha.captcha import Captcha c = Captcha() log.info(tmp_file_path) captcha_result = ...

  4. linux安装、使用优化、常用软件

    定制自己的ubuntu桌面系统 一.安装ubuntu 1.下载ubuntu镜像Iso文件 ubuntu官网下载:https://cn.ubuntu.com/download 2.u盘写入 (1)下载U ...

  5. 在一个C程序中,main()函数可以放在哪?

    C语言规定,在一个C程序中,main()函数的位置(). A.必须在系统调用的库函数之后 B.必须在程序的开始 C.必须在程序的最后 D.可以在任意位置 答案:D [解析] 每个C程序有且只有一个主函 ...

  6. 【ES6新增语法详述】

    目录 1. 变量的定义 let const 2. 模版字符串 3. 数据解构 4. 函数扩展 设置默认值 箭头函数 5. 类的定义 class 6. 对象的单体模式 "@ ES6新增了关于变 ...

  7. UseIIS

    asp.net core webapi的program.cs 文件中,要加上 使用IIS进程内,可以大幅提高处理速度

  8. 在 input 上添加图标字体时无法添加的问题

    效果:一个搜索框.如图: 实施过程:一开始,将搜索框分为2部分,用2个 input ,一个 search ,一个 button ,然后给 type="button" 的input ...

  9. [Jenkins] Jenkins的启动停止并修改默认端口

    在Win系统下面,经常使用Jenkins今天自动化测试工作,但是在搭建的时候还是有些坑 1.选择性安装: 一般会选择windows,会下载一个压缩包,然后step by step就可以安装成功,这个方 ...

  10. lintcode算法周竞赛

    ------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...