博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ural 1517. Freedom of Choice 后缀数组
阅读量:4575 次
发布时间:2019-06-08

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

 所谓后缀数组, 实际上准确的说,应该是排序后缀数组。

一个长度为N的字符串,显然有N个后缀,将他们放入一个数组中并按字典序排序就是后缀数组的任务。

这个数组有很好的性质,使得我们运行一些算法时 可以大幅度的优化。

本题就是后缀数组的一个主要应用, 快速求得后缀S(i)和S(j)的最长公共前缀LCP。

**由字典序的性质可知 S(i)和S(j)的LCP长度就是 h[sa[i]+1],h[sa[i]+2].... h[sa[j]]中的最小值,证明显然。

**而如何计算h数组呢? 有一个性质 h[rank[i]]>=h[rank[i-1]]-1. 由两两对应关系可以证明(同时去掉首字符)。

代码如下 后缀数组并不复杂

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int MAXN=200000+100;void radix(int *str,int *a,int *b,int n,int m){ static int count[MAXN]; memset(count,0,sizeof(count)); for(int i=0;i
=0;--i)b[--count[str[a[i]]]]=a[i];}void sorted_suffix_array(int *str,int *sa,int n,int m){ static int rank[MAXN],a[MAXN],b[MAXN]; for(int i=0;i
=n? 0:rank[j+(1<
ans&&(sa[i-1]
>n; string a,b; cin>>a>>b; work(a,b); return 0;}

  

转载于:https://www.cnblogs.com/heisenberg-/p/6628524.html

你可能感兴趣的文章
通过前端上传图片等文件的方法
查看>>
在 OC 中调用 Swift 代码
查看>>
安卓|五大逆向软件下载
查看>>
5 OK6410裸机调试(不用Jlink)
查看>>
“模板”学习笔记(5)-----编译器在处理函数模板的时候都干了啥
查看>>
教你用shell写CGI程序
查看>>
窗口 对话框 Pop Dialog 示例
查看>>
ubuntu(centos) server安装vmware tools
查看>>
数据结构之最大不重复串
查看>>
为什么要配置sdk-tools/platform-toools?
查看>>
自己动手开发更好用的markdown编辑器-07(扩展语法)
查看>>
队列的循环队列
查看>>
程序中的日期格式
查看>>
大众点评CAT错误总结以及解决思路
查看>>
从0开始学爬虫3之xpath的介绍和使用
查看>>
vim下正则表达式的非贪婪匹配
查看>>
一个python的计算熵(entropy)的函数
查看>>
spring源码学习——spring整体架构和设计理念
查看>>
模拟window系统的“回收站”
查看>>
报文格式【定长报文】
查看>>