博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HLG 1543 序列难题[后缀数组]
阅读量:6678 次
发布时间:2019-06-25

本文共 1263 字,大约阅读时间需要 4 分钟。

题意:

给出长度为n的数字序列,求重复出现次数不小于k的最长序列(连续)的长度。
例如序列 1 2 3 2 3 2 3 1,k=2,那么序列2 3 2 3重复出现了两次,长度为4。
分析:
二分枚举长度,如果在height数组中连续出现超过k次的话就满足。
View Code
#include 
#include
#include
using namespace std;const int maxn = 1000002;int s[maxn];int sa[maxn],t[maxn],t2[maxn],c[maxn];int N;void build_sa(int n,int m){ int i, *x=t, *y=t2; for (i=0; i
=0; i--) sa[--c[x[i]]] = i; int p; for (int k=1; k<=n; k<<=1) { p = 0; for (i=n-k; i
= k) y[p++] = sa[i]-k; for (i=0; i
=0; i--) sa[--c[x[y[i]]]] = y[i]; swap(x, y); p = 1; x[sa[0]] = 0; for (i=1; i
= n) break; m = p; }}int rank[maxn],height[maxn];void getheight(){ int i, j, k = 0; for (i=1; i<=N; i++) rank[sa[i]] = i; for (i=0; i
= len){ tot++; if (tot >= k) return true; } else tot = 1; } return false;}void solve(int k){ int i, j; int l, r, mid, res; l = k; r = N; while (l <= r){ mid = (l+r)/2; if (ok(mid, k)){ res = mid; l = mid+1; } else r = mid-1; } printf("%d\n",res);}int main(){ // freopen("in.in","r",stdin); int k, i; while (scanf("%d %d",&N,&k)!=EOF) { for (i=0; i

 

转载于:https://www.cnblogs.com/dream-wind/archive/2013/02/13/2911021.html

你可能感兴趣的文章
《程序员的自我修养-链接、装载和库》
查看>>
Qt 平台中使GUI保持响应流畅
查看>>
Func和Action的用法区别
查看>>
Go数组
查看>>
【原创】oracle提权执行命令工具oracleShell v0.1
查看>>
Mysql 二进制日志
查看>>
《JavaScript面向对象编程指南(第2版)》读书笔记(一)
查看>>
使用Html5+C#+微信 开发移动端游戏详细教程 :(五)游戏图像的加载与操作
查看>>
JAVA入门到精通-第24讲-容器、集合类
查看>>
Silverlight 如何手动打包xap
查看>>
VMware-workstation安装
查看>>
vue 开发2017年变化回顾及2018年展望
查看>>
利用FluorineFX录制音频与视频
查看>>
web api 文档声明
查看>>
Ubuntu下配置 keepalived+nginx+tomcat 负载均衡
查看>>
ffmpeg对rtmp的基本操作[转]
查看>>
iframe嵌入页面不能全部展示
查看>>
PHP 流程
查看>>
angular 自定义指令详解
查看>>
自写 zTree搜索功能 -- 关键字查询 -- 递归无限层
查看>>