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)详解
写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...
随机推荐
- java中栈内存与堆内存(JVM内存模型)
java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...
- 公用表表达式(CTE) with as 片段
1.为什么用CTE,而不用表变量, declare @t table(CountryRegionCode nvarchar(3)) insert into @t(CountryRegionCode) ...
- memcached 和 redis 性能测试比对
网上很多关于memcached 和 redis 区别的介绍,大部分都是说redis比memcached支持的数据类型多的话题,而性能比对确很少,我专门针对两者进行了性能测试比对. 测试内容如下: 两者 ...
- JS实现全选,取消全选,正常选择
//点击选择方法 onUserIdsChange(selVal) { if (this.form.groupUserIds.includes(-1) && !this.isSelect ...
- vue - 动态绑定 class
<template> <div class="todo-item" :class="{'is-complete':todo.completed}&q ...
- 微信小程序IOS真机调试发生了SSL 错误,无法建立与该服务器的安全连接
小程序 真机调试 IOS request:fail 发生了SSL 错误,无法建立与该服务器的安全连接,解决方法服务器中打开Powerhell,执行以下代码,然后重启服务器 # Enables TLS ...
- Hibernate(十)--spring整合hibernate
结构: Spring和Hibernate整合借助于HibernateTemplate applicationContext.xml <?xml version="1.0" e ...
- 三十二、CI框架之配置域名和设置默认登陆网站
一.打开routes.php文件,将$route['default_controller'] = 'login'; 修改成我们需要的内容. 二.修改config.php中的base_url数据 三.L ...
- BBS那些事儿
目录 1 注册 2 登陆 3 图片验证码相关 4 首页相关,Django Admin后台录入数据 5 注销功能 6 修改密码 7 用户头像展示,media配置 8 个人站点,个人侧边栏 9 侧边栏筛选 ...
- dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.63.dylib
本地环境报错有 3 处,如下: 1. 执行命令,无论执行 php 的什么命令,统一报错 dyld: Library not loaded: /usr/local/opt/icu4c/lib/libic ...