博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3261
阅读量:7153 次
发布时间:2019-06-29

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

后缀数组+单调队列

注意:后缀数组的所有后缀中包括空串,因此有strlen(s)+1个后缀。

View Code
#include 
#include
#include
#include
using namespace std;#define N 20005struct Elem{ int pos, value; Elem() {} Elem(int pp, int vv): pos(pp), value(vv) {}}q[N];int n, m;int s[N];// N > 256int sa[N], height[N], rank[N], tmp[N], top[N];void input(){ scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) scanf("%d", &s[i]);}void makesa(int n){ // O(N * log N) int i, j, len, na; na = (n < 256 ? 256 : n); memset(top, 0, na * sizeof(int)); for (i = 0; i < n; i++) top[rank[i] = s[i] & 0xff]++; for (i = 1; i < na; i++) top[i] += top[i - 1]; for (i = 0; i < n; i++) sa[--top[rank[i]]] = i; for (len = 1; len < n; len <<= 1) { for (i = 0; i < n; i++) { j = sa[i] - len; if (j < 0) j += n; tmp[top[rank[j]]++] = j; } sa[tmp[top[0] = 0]] = j = 0; for (i = 1; i < n; i++) { if (rank[tmp[i]] != rank[tmp[i - 1]] || rank[tmp[i] + len] != rank[tmp[i - 1] + len]) top[++j] = i; sa[tmp[i]] = j; } memcpy(rank, sa, n * sizeof(int)); memcpy(sa, tmp, n * sizeof(int)); if (j >= n - 1) break; }}void lcp(int n){ // O(4 * N) int i, j, k; for (j = rank[height[i = k = 0] = 0]; i < n - 1; i++, k++) while (k >= 0 && s[i] != s[sa[j - 1] + k]) height[j] = (k--), j = rank[sa[j] + 1];}void push(Elem a, int front, int &rear){ while (rear > front && a.value <= q[rear - 1].value) rear--; q[rear++] = a;}int work(){ int front = 0, rear = 0; for (int i = 1; i < m; i++) push(Elem(i, height[i]), front, rear); int ret = q[front].value; for (int i = m; i <= n; i++) { while (front != rear && q[front].pos <= i - m + 1) front++; push(Elem(i, height[i]), front, rear); ret = max(ret, q[front].value); } return ret;}int main(){ //freopen("t.txt", "r", stdin); input(); makesa(n + 1); lcp(n + 1); printf("%d\n", work()); return 0;}

转载于:https://www.cnblogs.com/rainydays/archive/2012/07/05/2577706.html

你可能感兴趣的文章
前端工程师的技术进阶点在哪里?
查看>>
Python系统编程之线程
查看>>
Volatile与多线程
查看>>
hibernate和jdbc的渊源
查看>>
electron + react + react-router + mobx + webpack 搭建脚手架工程
查看>>
5种exception(异常)
查看>>
编程--代码规范
查看>>
基于SpringCloud+vue(ElementUI)+mySQL前后端分离设计之--搭建eureka注册中心
查看>>
Python中的数据类型转换
查看>>
初探Egret3D——白鹭引擎架构师王泽演讲实录
查看>>
[LeetCode] 251. Flatten 2D Vector
查看>>
1024程序员节最新福利之2018最全Android资料集合
查看>>
【干货】Windows进程注入之CreateRemoteThread
查看>>
使用diskbenchmark测试硬盘性能
查看>>
这段代码很Pythonic:相见恨晚的itertools库
查看>>
SAP云平台架构概述
查看>>
确切的说spring框架是做什么的?(翻译自stackoverflow的一个回答)
查看>>
c#工程师用Visual Studio开发dapp应用程序
查看>>
javaScript学习之隐式转换
查看>>
Zend 官方框架增加 Swoole 协程支持 !
查看>>