学习了LRJ神犇的代码。orz。

首先真心建议了解下基数排序!!且要有一定的c++程序经验,否则程序很难看懂。

然后对着下面的程序调试(假装你已经会了算法思想)

弄个一个礼拜一下午就能学会了。

该算法基于倍增,然后错位比较,得到二元对并排序。

具体待更。

代码如下:

 #include <bits/stdc++.h>

 using namespace std;

 #define re register
 #define rep(i, a, b) for (re int i = a; i <= b; ++i)
 #define repd(i, a, b) for (re int i = a; i >= b; --i)
 #define For(i, a, b, s) for (re int i = a; i <= b; s)
 #define maxx(a, b) a = max(a, b)
 #define minn(a, b) a = min(a, b)
 #define LL long long
 #define INF (1 << 30)

 inline int read() {
     , f = ; char c = getchar();
      : f, c = getchar();
     ) + (w << ) + (c ^ '), c = getchar();
     return w * f;
 }

 ;

 char s[maxn];
 int t[maxn], t2[maxn], sa[maxn], c[maxn], n;

 void build_sa(int m) { // m表示字符集大小
     int *x = t, *y = t2; // 这样写是个技巧,可以快速交换数组(实际上交换了数组地址)
     rep(i, , m-) c[i] = ;
     rep(i, , n-) c[x[i] = s[i]]++;
     rep(i, , m-) c[i] += c[i-];
     repd(i, n-, ) sa[--c[x[i]]] = i; // 到这完成了初始字符串的基数排序
     ; k <= n; k <<= ) {
         ;
         rep(i, n-k, n-) y[p++] = i;
         rep(i, , n-) if (sa[i] >= k) y[p++] = sa[i]-k; //这两句完成了第二关键字的排序,而第二关键字为x[i]+k。
         rep(i, , m-) c[i] = ;
         rep(i, , n-) c[x[y[i]]]++;
         rep(i, , m-) c[i] += c[i-];
         repd(i, n-, ) sa[--c[x[y[i]]]] = y[i]; // 再完成第一关键字的排序
         swap(x, y); // 交换数组,原来的y数组(对应后面的x)没有用了
         p = ; x[sa[]] = ; // 根据原来的x数组(对应为y数组)修改现在的x数组
         rep(i, , n-)
             x[sa[i]] = y[sa[i]] == y[sa[i-]] && y[sa[i]+k] == y[sa[i-]+k] ? p- : p++;
         if (p == n) return; // 如果所有数两两不同,到目前为止sa一定唯一不变了,退出
         m = p; // 修改字符集大小
     }
 }

 int main() {
     scanf("%s", s);
     n = strlen(s);
     build_sa(();
     rep(i, , n-) printf();
     ;
 }

后缀数组(SA)的更多相关文章

  1. 后缀数组(SA)总结

    后缀数组(SA)总结 这个东西鸽了好久了,今天补一下 概念 后缀数组\(SA\)是什么东西? 它是记录一个字符串每个后缀的字典序的数组 \(sa[i]\):表示排名为\(i\)的后缀是哪一个. \(r ...

  2. 后缀数组SA学习笔记

    什么是后缀数组 后缀数组\(sa[i]\)表示字符串中字典序排名为\(i\)的后缀位置 \(rk[i]\)表示字符串中第\(i\)个后缀的字典序排名 举个例子: ababa a b a b a rk: ...

  3. 后缀数组SA入门(史上最晦涩难懂的讲解)

    参考资料:victorique的博客(有一点锅无伤大雅,记得看评论区),$wzz$ 课件(快去$ftp$%%%),$oi-wiki$以及某个人的帮助(万分感谢!) 首先还是要说一句:我不知道为什么我这 ...

  4. bzoj3796(后缀数组)(SA四连)

    bzoj3796Mushroom追妹纸 题目描述 Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他从 ...

  5. [笔记]后缀数组SA

    参考资料这次是真抄的: 1.后缀数组详解 2.后缀数组-学习笔记 3.后缀数组--处理字符串的有力工具 定义 \(SA\)排名为\(i\)的后缀的位置 \(rk\)位置为\(i\)的后缀的排名 \(t ...

  6. 【字符串】后缀数组SA

    后缀数组 概念 实际上就是将一个字符串的所有后缀按照字典序排序 得到了两个数组 \(sa[i]\) 和 \(rk[i]\),其中 \(sa[i]\) 表示排名为 i 的后缀,\(rk[i]\) 表示后 ...

  7. 浅谈后缀数组SA

    这篇博客不打算讲多么详细,网上关于后缀数组的blog比我讲的好多了,这一篇博客我是为自己加深印象写的. 给你们分享了那么多,容我自私一回吧~ 参考资料:这位dalao的blog 一.关于求Suffix ...

  8. 后缀数组SA

    复杂度:O(nlogn) 注:从0到n-1 const int maxn=1e5; char s[maxn]; int sa[maxn],Rank[maxn],height[maxn],rmq[max ...

  9. 洛谷2408不同字串个数/SPOJ 694/705 (后缀数组SA)

    真是一个三倍经验好题啊. 我们来观察这个题目,首先如果直接整体计算,怕是不太好计算. 首先,我们可以将每个子串都看成一个后缀的的前缀.那我们就可以考虑一个一个后缀来计算了. 为了方便起见,我们选择按照 ...

  10. 洛谷4248 AHOI2013差异 (后缀数组SA+单调栈)

    补博客! 首先我们观察题目中给的那个求\(ans\)的方法,其实前两项没什么用处,直接\(for\)一遍就求得了 for (int i=1;i<=n;i++) ans=ans+i*(n-1); ...

随机推荐

  1. Docker学习之docker常用命令

    docker ps -a 表示所有容器 docker pull 获取image docker build 创建image docker run 运行container docker images 列出 ...

  2. [转载 ]五种常见的 PHP 设计模式

    五种常见的 PHP 设计模式 策略模式 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个设计模 ...

  3. 第九周java动手动脑

    1.使用Files. walkFileTree()找出指定文件夹下所有扩展名为.txt和.java的文件. import java.io.IOException; import java.nio.fi ...

  4. 删除pdf中的链接

    在Acrobat中打开pdf文件,然后:编辑→首选项→一般→自动从文本检测URL,把此处的对勾去掉,以后就不会变为食指按的形状了! 还有以下的方法 方法1:“高级(A)”→“链接(L)”→“删除文档中 ...

  5. Windows10安装多个版本的PostgreSQL数据库,但是均没有自动注册Windows服务的解决方法

    1.确保正确安装了PostgreSQL数据库,注意端口号不能相同 我的安装目录如图: 其中9.6版本的端口号为5432,10版本的端口号为5433,11版本的端口号为5434.若不知道端口号,可在Po ...

  6. iSCSI 网关管理 - Storage6

    iSCSI网关集成了Ceph存储和iSCSI标准,以提供一个高可用性(HA) iSCSI目标,该目标将RADOS块设备(RBD)映像导出为SCSI磁盘.iSCSI协议允许客户机 (initiator) ...

  7. 【主动学习】Variational Adversarial Active Learning

    本文记录了博主阅读ICCV2019一篇关于主动学习论文的笔记,第一篇博客,以后持续更新哈哈 论文题目:<Variational AdVersarial Active Learning> 原 ...

  8. PHP高效产生m个n范围内的不重复随机数(m<=n)

    该算法非常巧妙的取随机数的位置(数组的下标),替代取随机数本身,每次取到一个随机数之后,就将其在取值范围中排除,下一次仅会在剩下的数字中取,一次遍历就可以完成随机数的选取,效率相当高. functio ...

  9. httprouter框架 (Gin使用的路由框架)

    之前在Gin中已经说到, Gin比Martini的效率高好多耶, 究其原因是因为使用了httprouter这个路由框架, httprouter的git地址是: httprouter源码. 今天稍微看了 ...

  10. .NetCore WebApi —— Swagger版本控制

    目录: .NetCore WebApi——Swagger简单配置 .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger) .NetCore WebApi —— Swagge ...