博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【后缀数组】poj3581 Sequence
阅读量:6811 次
发布时间:2019-06-26

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

考虑第一次切割,必然切割的是翻转后字典序最小的前缀,伪证:

若切割位置更靠前:则会导致第一个数翻转后更靠前,字典序必然更大。

若切割位置更靠后,则显然也会导致字典序更大。

↑,sa即可

对于第二次切割,有结论:将序列分割成两段再分别翻转得到的序列,可以看作是将两个原序列拼接得到的新序列中的某个字串翻转得到的序列。

因此计算新序列的sa,再从中选取字典序最小的合适的后缀即可。

因为要基数排序而又没有告诉权值的范围,因此要离散化。

#include
#include
#include
using namespace std;#define N 400001struct Point{int p,v;}T[N];bool operator < (Point a,Point b){return a.v
=n?-1:y[sa[i-1]+k])==(sa[i]+k>=n?-1:y[sa[i]+k])));}void build_sa(int s[],int range,int n){ int *x=t,*y=t2; memset(tong,0,sizeof(int)*range); for(int i=0;i
=0;--i) sa[--tong[x[i]]]=i; for(int k=1;k<=n;k<<=1) { int p=0; for(int i=n-k;i
=k) y[p++]=sa[i]-k; memset(tong,0,sizeof(int)*range); for(int i=0;i
=0;--i) sa[--tong[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for(int i=1;i
=n) break; range=p; }}int main(){ scanf("%d",&n); for(int i=0;i
=2) { for(int j=sa[i];j

转载于:https://www.cnblogs.com/autsky-jadek/p/4459660.html

你可能感兴趣的文章
黑幕背后的Autorelease
查看>>
JAVA并发容器之CopyOnWrite容器
查看>>
路飞学城-Python爬虫集训-第二章
查看>>
数据恢复系列(4)~开源恢复工具
查看>>
linux中pip安装步骤与使用详解
查看>>
Zookeeper,Hbase 伪分布,集群搭建
查看>>
Masterwoker模式
查看>>
IntelliJ IDEA安装lombok
查看>>
会议室预定功能
查看>>
Mac OS 电信3G上网设置
查看>>
Django__WSGI
查看>>
JS 判断是否为IP格式
查看>>
AMD,CMD,UMD,CommonJS
查看>>
简单的活动抽奖算法&方案
查看>>
8th
查看>>
自我分析和展望
查看>>
Android IOS WebRTC 音视频开发总结(六三)-- 2016国内IM云服务行业分析
查看>>
java 编程思想 一 第二章(对象)
查看>>
javaScript 面向对象与原型
查看>>
CSS定位设置实例——盒子的定位
查看>>