题目原意:输入两个字符串,求最长的连续公共子串的长度;
看了好长时间时间这个题,要用到后缀数组,于是下了个模板基数排序求后缀数组AC的。将两个字符串连接起来(模板里的基数排序求后缀数组要用int型,so将每个字符转换成整形),为了使得出现最长的公共子串在前后两部分里面,所以中间加个不可能出现的值(随意);然后将求最长公共子串(同时要判断的是公共子串的开头是否在两个区域OK了)。
#include<iostream>
#include<string>
using namespace std;
const int MAX = 200100;
int n, num[MAX];
int sa[MAX], rank[MAX],height[MAX];//sa[i]表示排名第i的后缀的位置,height[i]表示后缀SA[i]和SA[i-1]的最长公共前缀
int wa[MAX], wb[MAX], wv[MAX], wd[MAX];//基数排序模板不要修改
int cmp(int *r, int a, int b, int l)
{
}
void da(int *r, int n, int m)
//
倍增算法0(nlgn)。
{
}
void calHeight(int *r, int n)
//
求height数组。
{
}
int main()
{
}