博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ705 SUBST1 - New Distinct Substrings(后缀数组)
阅读量:5349 次
发布时间:2019-06-15

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

给一个字符串求有多少个不相同子串。

每一个子串一定都是某一个后缀的前缀。由此可以推断出总共有(1+n)*n/2个子串,那么下面的任务就是找这些子串中重复的子串。

在后缀数组中后缀都是排完序的,从sa[1]到sa[n],这么思考以某个串为前缀的子串有几个,那么容易想到重复子串的个数其实就是∑height[i]。

所以结果就是(1+n)*n/2-∑height[i]。

1 #include
2 #include
3 #include
4 using namespace std; 5 #define INF (1<<30) 6 #define MAXN 55000 7 8 int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN]; 9 int cmp(int *r,int a,int b,int l){10 return r[a]==r[b] && r[a+l]==r[b+l];11 }12 int sa[MAXN],rank[MAXN],height[MAXN];13 void SA(int *r,int n,int m){14 int *x=wa,*y=wb;15 16 for(int i=0; i
=0; --i) sa[--ws[x[i]]]=i;20 21 int p=1;22 for(int j=1; p
=j) y[p++]=sa[i]-j;26 for(int i=0; i
=0; --i) sa[--ws[wv[i]]]=y[i];31 swap(x,y); x[sa[0]]=0; p=1;32 for(int i=1; i

 

转载于:https://www.cnblogs.com/WABoss/p/5203471.html

你可能感兴趣的文章
禅道在docker上部署与迁移
查看>>
关于继承、封装、多态、抽象和接口
查看>>
c27---typedef
查看>>
android WebViewClient和WebChromeClient
查看>>
div+css清除浮动代码
查看>>
017Python路--解释器
查看>>
idea2019中utf-8乱码问题
查看>>
docker应用-3(搭建hadoop以及hbase集群)
查看>>
Java学习:标准类
查看>>
Python:pip 和pip3的区别
查看>>
ACCESS+ASP数据库乱码的解决
查看>>
关于PHP时间的
查看>>
java TCP/IP socket
查看>>
day05接口
查看>>
JVM调优之经验
查看>>
机器学习算法
查看>>
python系列十七:Python3 标准库概览
查看>>
leetcode 解题 String to Integer (atoi)(C&python)
查看>>
ios UI实现技巧
查看>>
ubuntu 在XP下硬盘安装
查看>>