博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.11.24 poj2774Long Long Message(后缀数组)
阅读量:5052 次
发布时间:2019-06-12

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

实际上可以用后缀自动机秒掉
当然后缀数组也挺好写。
我们将两个字符串接在一起,为了方便中间用一个特殊字符连接。
然后对新字符串求heightheightheight数组。
求出来之后对所有满足sai,sai−1sa_i,sa_{i-1}sai,sai1属于两个不同字符串的heightheightheight取最大值就行了。
代码:

#include
#include
#include
#define ri register intusing namespace std;const int N=2e5+5;int n,m,len,sa[N],sa2[N],rk[N],ht[N],ans;char s[N],t[N];inline void Sort(){
static int cnt[N]; for(ri i=1;i<=m;++i)cnt[i]=0; for(ri i=1;i<=n;++i)++cnt[rk[i]]; for(ri i=2;i<=m;++i)cnt[i]+=cnt[i-1]; for(ri i=n;i;--i)sa[cnt[rk[sa2[i]]]--]=sa2[i];}inline void getsa(){
for(ri i=1;i<=n;++i)rk[i]=s[i]-'a'+1,sa2[i]=i; m=27,Sort(); for(ri w=1,p=0;m!=n;w<<=1,p=0){
for(ri i=n-w+1;i<=n;++i)sa2[++p]=i; for(ri i=1;i<=n;++i)if(sa[i]>w)sa2[++p]=sa[i]-w; Sort(),swap(sa2,rk),rk[sa[1]]=p=1; for(ri i=2;i<=n;++i)rk[sa[i]]=(sa2[sa[i]]==sa2[sa[i-1]]&&sa2[sa[i]+w]==sa2[sa[i-1]+w])?p:++p; m=p; } for(ri i=1,j,k=0;i<=n;ht[rk[i++]]=k)for(k?--k:k,j=sa[rk[i]-1];s[i+k]==s[j+k];++k);}int main(){
scanf("%s%s",s+1,t+1),n=strlen(s+1),len=strlen(t+1),s[++n]='z'+1; for(ri i=1;i<=len;++i)s[++n]=t[i]; len=n-len-1,getsa(),ans=0; for(ri i=2,a=sa[i-1],b=sa[i];i<=n;a=sa[i],b=sa[++i]){
if(a>b)swap(a,b); if(a<=len&&b>len)ans=max(ans,ht[i]); } cout<

转载于:https://www.cnblogs.com/ldxcaicai/p/10084713.html

你可能感兴趣的文章
201521123069 《Java程序设计》 第4周学习总结
查看>>
线性表的顺序存储——线性表的本质和操作
查看>>
【linux】重置fedora root密码
查看>>
pig自定义UDF
查看>>
输入名字显示其生日,没有则让输入生日,做记录
查看>>
Kubernetes 运维学习笔记
查看>>
并查集 经典 畅通工程
查看>>
Spark MLlib 之 Naive Bayes
查看>>
php修改SESSION的有效生存时间
查看>>
spring security 11种过滤器介绍
查看>>
Hibernate一对多、多对一关联
查看>>
一、记录Git使用中遇到的问题及解决方法
查看>>
学习网址
查看>>
前端表格插件datatables
查看>>
内部类
查看>>
树链剖分入门
查看>>
图解算法时间复杂度
查看>>
UI_搭建MVC
查看>>
一个样例看清楚JQuery子元素选择器children()和find()的差别
查看>>
代码实现导航栏分割线
查看>>