#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <string.h> #include <queue> //POJ1743 求不可重叠的最长重复子串(后缀数组) #define maxn 20005 using namespace std; int wa[maxn],wb[maxn],wv[maxn],Ws[maxn], Rank[maxn], height[maxn], sa[maxn]; int a[maxn]; //以下为倍增算法,套模板 /* height数组是从1到n的 height数组是排名相邻的两个后缀的最长公共前缀(公共长度) 字符串中的两个子串的公共前缀想要最长,一定是在sa数组相邻的 */ int cmp(int *r,int a,int b,int l) {return r[a]==r[b]&&r[a+l]==r[b+l];} void da(const int *r,int *sa,int n,int m) //r为字符串(将其都转化为int),n为字符串长度,m为字符的取值范围 { int i,j,p,*x=wa,*y=wb,*t; for(i=0;i<m;i++) Ws[i]=0; for(i=0;i<n;i++) Ws[x[i]=r[i]]++; for(i=1;i<m;i++) Ws[i]+=Ws[i-1];
不可重叠的最长重复子串(后缀数组)
最新推荐文章于 2022-07-16 20:55:52 发布
该程序实现了一个算法,利用后缀数组和倍增算法解决POJ1743问题,即找出字符串中不可重叠的最长重复子串。通过输入整数序列,创建新的数列并寻找最长重复子串的长度,采用二分查找优化效率,最终输出符合条件的子串长度。
摘要由CSDN通过智能技术生成