计算两个字符串s和t的最长公共子串
由于在一个字符串中出现两次的最长子串一定在相邻两个后缀数组元素的最长公共前缀中取得,也就是高度数组的最大值,所以通过插入一个在两个字符串中不可能出现的字符,将两个字符串连接起来,计算后缀数组和高度数组。其中,分属于字符串s和t的后缀的高度数组元素的最大值就是最长公共子串的长度
模板题:hdu1403 Longest Common Substring
#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<cstring>
#include<string>
#include<sstream>
#include<cmath>
#include<ctime>
#include<algorithm>
#define LL long long
#define PII pair<int,int>
#define PLL pair<LL,LL>
#define pi acos(-1.0)
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=200010;
int T,n,a[maxn],sa[maxn],rk[maxn],temp[maxn],lcp[maxn],k;
string s,t;
bool cmp_sa(int i,int j){
if(rk[i]!=rk[j])return rk[i]<rk[j];
else{
int ri = i+k<=n?rk[i+k]:-1;
int rj = j+k<=n?rk[j+k]:-1;
return ri<rj;
}
}
void construct_sa(string S,int len, int *sa){
int n=len;
for(int i=0;i<=n;++i){
sa[i]=i;
rk[i]=i<n?s[i]:-1;
}
for(k=1;k<=n;k*=2){
sort(sa,sa+n+1,cmp_sa);
temp[sa[0]]=0;
for(int i=1;i<=n;++i){
temp[sa[i]] = temp[sa[i-1]]+ (cmp_sa(sa[i-1],sa[i])?1:0);
}
for(int i=0;i<=n;++i){
rk[i]=temp[i];
}
}
}
void construct_lcp(string S,int *sa,int *lcp){
int n=S.length();
for(int i=0;i<=n;i++) rk[sa[i]]=i;
int h=0;
lcp[0]=0;
for(int i=0;i<n;i++){
int j=sa[rk[i]-1];
if(h>0) h--;
for(;j+h<n && i+h<n;h++){
if(S[j+h]!=S[i+h]) break;
}
lcp[rk[i]-1]=h;
}
}
void solve(){
int s1=s.length();
s+='\0'+t;
n=s.length();
construct_sa(s,n,sa);
construct_lcp(s,sa,lcp);
int ans=0;
for(int i=0;i<n;i++){
if((sa[i]<s1)!=(sa[i+1]<s1)){
ans=max(ans,lcp[i]);
}
}
printf("%d\n",ans);
}
int main(){
std::ios::sync_with_stdio(false);
while(getline(cin,s)){
getline(cin,t);
solve();
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)