点此看题面

大致题意: 求两个字符串中最长公共子串的长度。

关于后缀数组

关于\(Height\)数组的概念以及如何用后缀数组求\(Height\)数组详见这篇博客:后缀数组入门(二)——Height数组与LCP

大致思路

由于后缀数组是处理一个字符串的,因此我们第一步自然是将这两个字符串拼在一起,并在中间加一个不可能出现的字符,例如\(\%\)。

然后我们用后缀数组求出其\(Height\)数组。

注意一个性质,答案肯定是按字典序排名后相邻后缀的\(LCP\)值中的最大值

因此,我们只要枚举\(i\),判断后缀\(_{SA_i}\)与后缀\(_{SA_{i-1}}\)的起始字符是否在同一个字符串内,然后更新答案即可。

回顾\(Height\)数组定义就是\(Height_i=LCP(i,i-1)\)。

因此我们其实不用再额外去求相邻后缀的\(LCP\),直接调用\(Height\)数组即可。

具体实现详见代码。

代码

#include<cstdio>
#include<cstring>
#define N 100000
#define Gmax(x,y) (x<(y)&&(x=(y)))
using namespace std;
int n,m;char s[(N<<1)+5];
class Class_SuffixArray//后缀数组
{
private:
int n,rk[(N<<1)+5],pos[(N<<1)+5],tot[(N<<1)+5];
inline void RadixSort(int S)
{
register int i;
for(i=0;i<=S;++i) tot[i]=0;
for(i=1;i<=n;++i) ++tot[rk[i]];
for(i=1;i<=S;++i) tot[i]+=tot[i-1];
for(i=n;i;--i) SA[tot[rk[pos[i]]]--]=pos[i];
}
inline void GetSA(char *s)
{
register int i,k,cnt=0,Size=122;
for(n=strlen(s),i=1;i<=n;++i) rk[pos[i]=i]=s[i-1];
for(RadixSort(Size),k=1;cnt<n;k<<=1)
{
for(Size=cnt,cnt=0,i=1;i<=k;++i) pos[++cnt]=n-k+i;
for(i=1;i<=n;++i) SA[i]>k&&(pos[++cnt]=SA[i]-k);
for(RadixSort(Size),i=1;i<=n;++i) pos[i]=rk[i];
for(rk[SA[1]]=cnt=1,i=2;i<=n;++i) rk[SA[i]]=(pos[SA[i-1]]^pos[SA[i]]||pos[SA[i-1]+k]^pos[SA[i]+k])?++cnt:cnt;
}
}
inline void GetHeight(char *s)
{
register int i,j,k=0;
for(i=1;i<=n;++i) rk[SA[i]]=i;
for(i=1;i<=n;++i)
{
if(!(rk[i]^1)) continue;
k&&--k,j=SA[rk[i]-1];
while(i+k<=n&&j+k<=n&&!(s[i+k-1]^s[j+k-1])) ++k;
Height[rk[i]]=k;
}
}
public:
int SA[(N<<1)+5],Height[(N<<1)+5];
inline void Init(char *s) {GetSA(s),GetHeight(s);}
}S;
int main()
{
register int i,ans=0;
scanf("%s",s),n=strlen(s),s[n]='%',scanf("%s",s+n+1),m=strlen(s+n+1);
for(S.Init(s),i=1;i<=n+m;++i) if((S.SA[i]<n)^(S.SA[i-1]<n)) Gmax(ans,S.Height[i]);//如果相邻两个后缀的起始字符不在同一个字符串内,就更新答案
return printf("%d",ans),0;
}

最新文章

  1. rails查询mongodb通用查询
  2. db2 字符串转换 数字
  3. [原创]一种Unity2D多分辨率屏幕适配方案
  4. CAD输出的局部平面坐标数据配准转换到WGS84坐标系
  5. 科大讯飞和Tizen-TTS语音合成引擎
  6. sae Servlet class XXXX is not a javax.servlet.Servlet
  7. spring mvc ajax
  8. HDU 1057 - A New Growth Industry
  9. Linux随笔(安装ftp,安装jdk,安装 tomcat,安装redis,安装MySQL)
  10. 详细的css命名规则,专业点吧
  11. 以pfile或者spfile启动时show parameter pfile的不同结果
  12. 从壹开始微服务 [ DDD ] 之六 ║聚合 与 聚合根 (下)
  13. [Swift]LeetCode174. 地下城游戏 | Dungeon Game
  14. Curve 曲线 工具
  15. Java 异常与反射 总结
  16. npm安装webpack失败(mac和window都可能会遇到这样的情况,以下问题主要以mac为例)
  17. vue学习笔记1-基本知识
  18. 使用Java合并图片、修改DPI
  19. 《Python》网络编程之客户端/服务端框架、套接字(socket)初使用
  20. excel文档中数据导入sql server注意事项

热门文章

  1. React.Component(V16.8.6)
  2. Unable to round-trip http request to upstream: EOF问题
  3. 洛谷P1349 广义斐波那契数列
  4. 整合spring和hibernate框架
  5. Java Web中相对路径与绝对路径的分析
  6. js 数组,字符串,json互相转换(在select实现多个输入的时候与后台交互常使用)
  7. Oracle存储过程实例分析总结(代码)
  8. Docker从入门到实战(四)
  9. jasper_excel_sheet tab color
  10. UVALive - 6436