博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长重复子串(可重叠) 后缀数组
阅读量:5101 次
发布时间:2019-06-13

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

找了半天终于找到一个可以提交的地方。。。

 

题解:

任何一个重复子串,都必然是某两个后缀的最长公共前缀。

因为,两个后缀的公共前缀,它出现在这两个后缀中,并且起始位置时不同的,所以这个公共前缀必然重复出现两次以上(可重叠)。

而任何两个后缀的最长公共前缀为某一段height值中的最小值,所以最大为height值中的最大值(即某个lcp(sa[i],sa[i+1]))。

所以只要算出height数组,然后输出最大值就可以了。

 

View Code
1 #include 
2 #include
3 #include
4 #include
5 #include
6 7 #define N 50050 8 9 using namespace std;10 11 int wa[N],wb[N],wc[N],wv[N];12 int r[N],sa[N];13 char str[N];14 int rank[N],height[N];15 16 inline bool cmp(int *r,int a,int b,int l)17 {18 return r[a]==r[b]&&r[a+l]==r[b+l];19 }20 21 inline void da(int *r,int *sa,int n,int m)22 {23 int i,j,p,*x=wa,*y=wb,*t;24 for(i=0;i
=0;i--) sa[--wc[x[i]]]=i;28 for(j=1,p=1;p
<<=1,m=p)29 {30 for(i=n-j,p=0;i
=j) y[p++]=sa[i]-j;32 for(i=0;i
=0;i--) sa[--wc[wv[i]]]=y[i];37 for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i
ans) ans=height[i],pos=sa[i];62 for(int i=pos;i

 

 

转载于:https://www.cnblogs.com/proverbs/archive/2013/02/05/2893409.html

你可能感兴趣的文章
hive基本操作与应用
查看>>
python protobuf在不确定消息类型的情况下解析消息
查看>>
自定义标签 tld
查看>>
java class加载机制及对象生成机制
查看>>
Linux日志分割--logrotate
查看>>
17.如何修改SESSION的生存时间。
查看>>
前端面试题
查看>>
关于讯飞语音SDK开发学习
查看>>
(Hibernate进阶)Hibernate基本映射(三)
查看>>
requirejs简单应用
查看>>
通过 chroot 解决 Linux 系统无法启动的问题
查看>>
OSX Dev Day 3 - NSCollectionView
查看>>
httpclient post
查看>>
倒计时练习
查看>>
深入浅出多线程——ReentrantLock (二)
查看>>
数据结构4 图
查看>>
iOS把汉字转成拼音
查看>>
程序员学习网站
查看>>
Python 入门笔记 字符串 变量 标示符
查看>>
初入react -02
查看>>