Poj 2774 Long Long Message|后缀数组
2016-01-10 10:36
441 查看
后缀数组裸题
两串合并中间加一个‘$'
然后求height数组
然后求排名相邻 但原来不在同一个字符串中的两个后缀的height值的最大值
两串合并中间加一个‘$'
然后求height数组
然后求排名相邻 但原来不在同一个字符串中的两个后缀的height值的最大值
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<queue> #include<vector> #include<set> #include<map> #include<iostream> #include<algorithm> #define T 555555 using namespace std; char s[T]; int t1[T],t2[T],cc[T],sa[T],rank[T],height[T]; int l1,l2,len; bool cmp(int *y,int a,int b,int k) { int a1=y[a],b1=y[b]; int a2=a+k>=len?-1:y[a+k]; int b2=b+k>=len?-1:y[b+k]; return a1==b1&&a2==b2; } void make_sa() { int *x=t1,*y=t2,m=333; for(int i=0;i<len;i++)++cc[x[i]=s[i]]; for(int i=1;i<m;i++)cc[i]+=cc[i-1]; for(int i=len-1;~i;i--)sa[--cc[x[i]]]=i; for(int k=1;k<=len;k<<=1) { int p=0; for(int i=len-k;i<len;i++)y[p++]=i; for(int i=0;i<len;i++)if(sa[i]>=k)y[p++]=sa[i]-k; for(int i=0;i<m;i++)cc[i]=0; for(int i=0;i<len;i++)++cc[x[y[i]]]; for(int i=1;i<m;i++)cc[i]+=cc[i-1]; for(int i=len-1;~i;i--)sa[--cc[x[y[i]]]]=y[i]; swap(x,y);m=1;x[sa[0]]=0; for(int i=1;i<len;i++)x[sa[i]]=cmp(y,sa[i],sa[i-1],k)?m-1:m++; //cout << m << endl; if(m>=len)break; } } void make_height() { int k=0; for(int i=0;i<len;i++)rank[sa[i]]=i; for(int i=0;i<len;i++) { if(!rank[i])continue; int j=sa[rank[i]-1]; if(k)k--; while(s[i+k]==s[j+k])k++; height[rank[i]]=k; } } int main() { scanf("%s",s); l1=strlen(s); s[l1]='$'; scanf("%s",s+l1+1); l2=strlen(s+l1+1); len=l1+l2+1; make_sa(); make_height(); int ans=0; for(int i=1;i<len;i++) { if(sa[i]<l1&&sa[i-1]>l1)ans=max(ans,height[i]); if(sa[i]>l1&&sa[i-1]<l1)ans=max(ans,height[i]); } cout << ans; return 0; }
相关文章推荐
- spring jmx 整合
- LeetCode - Binary Tree Level Order Traversal
- 邮件系统服务器搭建记录(五)(Postfix+Cyrus-sasl+Courier-authlib+Dovecot+ExtMail+MySQL)
- I/O 基础之缓冲区
- scala的高阶函数
- 写在15年初
- hibernate 与MYSQL 求两个字符串数组的交集
- oracle 11g 安装
- phpmyadmin #1045 #2002 无法登录 MySQL 服务器的解决方
- 两个数和三个数的最大值和最小值宏定义
- 从测试和考试反射出的问题
- 007Reverse Integer (C)
- debian 安装博通无线网卡驱动
- Git中的merge命令实现和工作方式
- Linux操作命令(三)
- linux input子系统驱动(三)
- Django自学习7 views.py
- 关灯游戏
- 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
- haml入门