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

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+;
char s[maxn];
int n;
int rk[maxn];
int sa[maxn];
int height[maxn];
int tmp[maxn];
int c[maxn];
int t1[maxn];
int t2[maxn];
void build_sa (char s[],int n,int m) {
int i,j,p;
int *x=t1;
int *y=t2;
for (i=;i<m;i++) c[i]=;
for (i=;i<n;i++) c[x[i]=s[i]]++;
for (i=;i<m;i++) c[i]+=c[i-];
for (i=n-;i>=;i--) sa[--c[x[i]]]=i;
for (j=;j<=n;j<<=) {
p=;
for (i=n-j;i<n;i++) y[p++]=i;
for (i=;i<n;i++) if (sa[i]>=j) y[p++]=sa[i]-j;
for (i=;i<m;i++) c[i]=;
for (i=;i<n;i++) c[x[y[i]]]++;
for (i=;i<m;i++) c[i]+=c[i-];
for (i=n-;i>=;i--) sa[--c[x[y[i]]]]=y[i];
swap(x,y);
p=;
x[sa[]]=;
for (i=;i<n;i++)
x[sa[i]]=y[sa[i-]]==y[sa[i]]&&y[sa[i-]+j]==y[sa[i]+j]?p-:p++;
if (p>=n) break;
m=p;
}
}
void getHeight (char s[],int n) {
int i,j,k=;
for (i=;i<=n;i++) rk[sa[i]]=i;
for (i=;i<n;i++) {
if (k) k--;
j=sa[rk[i]-];
while (s[i+k]==s[j+k]) k++;
height[rk[i]]=k;
}
}
int main () {
int len;
scanf ("%d",&len);
getchar ();
cin.getline (s,maxn);
n=strlen(s);
build_sa (s,n+,);
getHeight (s,n);
int cnt=;
int res=;
int ans=;
for (int i=;i<=n;i++) {
if (height[i]>=len) ans++;
else ans=;
if (sa[i]+len<=n&&cnt<ans) {
cnt=ans;
res=sa[i];
}
}
for (int i=;i<len;i++)
printf ("%c",s[res+i]);
printf (" %d",cnt);
return ;
}

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. 09day 命令提示符优化及yum优化

    export PS1='\[\e[32;1m\][\u@\h \W]\$ \[\e[0m\]' 设置颜色 内容 结束 export PS1='\[\e[30;1m\][\u@\h \W]\$ \[\e ...

  2. iOS性能优化之内存(memory)优化

    https://www.jianshu.com/p/8662b2efbb23 近期在工作中,对APP进行了内存占用优化,减少了不少内存占用,在此将经验进行总结和分享,也欢迎大家进行交流. 在优化的过程 ...

  3. 交换分区swap和日志系统

    目录 1.使用系统中的某个文件作为swap分区 1.1创建swapfile 1.2格式化swap分区 1.3检查当前swap分区情况 1.4临时启用新建swap分区并查看情况 1.5 关闭新建的swa ...

  4. BZOJ-1563-郁闷的出纳员(权值线段树)

    偏移量要考虑清楚. #include <bits/stdc++.h> using namespace std; const int N=4e5+10; const int BASE=1e5 ...

  5. Android学习07

    自定义Dialog 创建一个Java类CustomDialog继承Dialog. package com.example.helloworld.widget; import android.app.D ...

  6. 用数组实现 最简 hash线性探测

    package arr; import java.util.Random; /** 模拟线性寻址式hash函数 模拟将1000大小包含50个数字的数组,存入大小为100的数组内(为了方便判断,我们将0 ...

  7. 洛谷 P1563 玩具谜题(模拟)

    嗯... 题目链接:https://www.luogu.org/problem/P1563 这道题主要问题就是弄明白顺逆时针的问题,其实可以简化成一个异或的问题:当head与x异或值为零时,即为顺时针 ...

  8. Chrome浏览器切页快捷键

    Chrome浏览器切换标签页快捷键 1.Ctrl + Tab 向左切换标签页 2.Ctrl + shift + Tab 向右切换 3.Ctrl + 1 切换到第一个页面 4.Ctrl + 9 切换到最 ...

  9. http的长连接和短连接(史上最通俗!)

    1.以前的误解 很久之前就听说过长连接的说法,而且还知道HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接.但终究觉得对于长连接一直懵懵懂懂的,有种抓不到关键点的感觉. 今天 ...

  10. SVG和canvas的区别

    1.Canvas 是用JavaScript 操作动态生成的, SVG 则是使用XML静态描述生成的; 2.Canvas 基于位图,简单来说就是图片放大会影响到显示的效果,造成不好的影响,SVG 基于矢 ...