tyvj 1860 后缀数组
真·模板题(然而还是TLE了,tyvj真是个毒瘤,输出double什么的就是 -0.00000000,这些就TLE2333)
简单的说一下本蒟蒻看了一天后缀数组的收获(这东西太神了,,,wcwc,,收获到我的膝盖233,还是不太理解这个神奇的东西)(鉴于本人太虚,只看了一下倍增,照着黄学长扒了一个板子23333)
一共有3个神奇的数组,sa(Sufiix Array),rank,height
对于前两个数组的求法,用基数排序的方法,每次搞出长度为2^i(除了最后,,)的子串的rank,然后用这些子串(当前长度为2^i和下一个),来更新出长度为2^(i+1)的子串
所以,一共是进行了log(strlen(ch))次的。
里面有一些小细节自己YY一下就好了,(吐槽,各种各样的sa[v[rank[..]..].]太恶心了2333)
#include<bits/stdc++.h>
#define N 100005<<2
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
inline int ra()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
char ch[N];
int n,k,p,q;
int a[N],rank[][N],sa[][N],height[N],v[N];
void cal_sa(int sa[N], int rank[N], int Sa[N], int Rank[N])
{
for (int i=; i<=n; i++) v[rank[sa[i]]]=i;
for (int i=n; i>=; i--)
if (sa[i]>k) Sa[v[rank[sa[i]-k]]--]=sa[i]-k;
for (int i=n-k+; i<=n; i++) Sa[v[rank[i]]--]=i;
for (int i=; i<=n; i++) Rank[Sa[i]]=Rank[Sa[i-]]+(rank[Sa[i]]!=rank[Sa[i-]] || rank[Sa[i]+k]!=rank[Sa[i-]+k]);
}
void get_height()
{
k=;
for (int i=; i<=n; i++)
{
if (rank[p][i]==) height[]=;
else{
int j=sa[p][rank[p][i]-];
while (a[i+k]==a[j+k]) k++;
height[rank[p][i]]=k;
if (k>) k--;
}
}
}
void work()
{
p=,q=;
for (int i=; i<=n; i++) v[a[i]]++;
for (int i=; i<=; i++) v[i]+=v[i-];
for (int i=; i<=n; i++) sa[p][v[a[i]]--]=i;
for (int i=; i<=n; i++) rank[p][sa[p][i]]=rank[p][sa[p][i-]]+(a[sa[p][i]]!=a[sa[p][i-]]);
for (k=; k<n; k<<=,p^=,q^=) cal_sa(sa[p],rank[p],sa[q],rank[q]);
get_height();
}
int main()
{
scanf("%s",ch+);
n=strlen(ch+);
for (int i=; i<=n; i++) a[i]=ch[i]-'a'+;
work();
for (int i=; i<=n; i++)
printf("%d ",sa[p][i]); cout<<endl;
for (int i=; i<=n; i++)
printf("%d ",height[i]);
return ;
}
tyvj 1860 后缀数组的更多相关文章
- 后缀数组 TYVJ P1860 后缀数组
/*P1860 后缀数组时间: 1000ms / 空间: 131072KiB / Java类名: Main描述 我们定义一个字符串的后缀suffix(i)表示从s[i]到s[length(s)]这段子 ...
- [tyvj1860]后缀数组
题目链接:http://www.tyvj.cn/p/1860 解题关键:模板题.贴一个代码详解 http://www.cnblogs.com/staginner/archive/2012/02/02/ ...
- [TyvjP1515] 子串统计 [luoguP2408] 不同子串个数(后缀数组)
Tyvj传送门 luogu传送门 经典题 统计一个字符串中不同子串的个数 一个字符串中的所有子串就是所有后缀的前缀 先求出后缀数组,求出后缀数组中相邻两后缀的 lcp 那么按照后缀数组中的顺序遍历求解 ...
- 后缀数组的倍增算法(Prefix Doubling)
后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- POJ1743 Musical Theme [后缀数组]
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 27539 Accepted: 9290 De ...
- 后缀数组(suffix array)详解
写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...
随机推荐
- Centos7 网卡Device does not seem to be present解决办法
1.ifconfig -a 查看当前所有网卡 2.修改网络配置文件 3.在原来文件的基础上,修改网卡名称 DEVICE=ens32 NAME=ens32 并且把UUID以及mac地址删掉 mv ifc ...
- Java - Obejct
关于Object类(Java 10)中的方法,根据其所涉及的知识点,分为如下4个部分: 基础 clone: protected Object clone() throws CloneNotSuppor ...
- Jmeter测试入门——分析HBase访问服务性能瓶颈
开启HBase服务 新建线程组,设定线程数为10: 设定请求方法和请求参数: 查看请求的返回结果: 查看服务响应的性能分析结果: 可能出问题的地方:Phoenix.数据库连接池(操作Phoenix)
- 你必须知道的.Net 8.4.4 位枚举
位标记集合是一种由组合出现的元素形成的列表,通常设计为以“位或”运算组合新值:枚举 类型则通常表达一种语义相对独立的数值集合.而以枚举类型来实现位标记集合是最为完美的组 合,简称为位枚举.在.NET ...
- Console-terminal-tty-shell-kernel
Console-terminal-tty-shell-kernel 1. 先看图表 1.1 简表 1.2 shell与内核的示意图 1.3 Console-terminal-t ...
- 基于LAMP实现后台活动发布和前端扫码签到系统
目的 无论是公司.学校和社会团体,都会举办各式各样的活动,比如运动会.部门会议.项目会议.野炊.团建等.作为团队管理者来讲,当然希望能够把这类活动转移到线上形成完整的系统,类似于电子流的形式.本文以学 ...
- 移动 web 开发问题和优化小结
1.前言 到目前为止,互联网行业里,手机越来越智能化,移动端占有的比例越来越高,尤其实在电商,新闻,广告,游戏领域.用户要求越来越高,网站功能越来越好,效果越来越炫酷,这就要求我们产品质量越来越高,w ...
- centos搭建gitlib
sudo yum install -y curl policycoreutils-python openssh-server sudo yum -y install postfixsudo syste ...
- Acwing200 Hankson的趣味题
原题面:https://www.acwing.com/problem/content/202/ 题目大意:gcd(x,a0)=a1,lcm(x,b0)=b1,问你有多少满足条件的正整数x. 输入描述: ...
- P1045 快速排序
P1045 快速排序 转跳点: