1、将字符串 复制一份变成 就转化成了后缀排序问题
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
char s[N];
int n, m; //n是后缀个数, m是桶的个数
int x[N]; //桶数组
int y[N]; //辅助数组
int c[N]; //计数数组
int sa[N]; //sa[k] 表示排名为k的数组后缀编号
int rk[N]; //rk[k] 表示后缀字符串k 的排名
int height[N]; // heght[k] = lcp(sa[i], sa[i - 1])
void get_sa()
{
int i, k;
// 按第一个字母排序
for(i = 1; i <= n; ++i) // 按第一个字母编桶号, 并累计
c[(x[i] = s[i])]++;
for(i = 1; i <= m; ++i)
c[i] += c[i - 1];
for(i = n; i; --i)