8个WA,12个MLE
#include <bits/stdc++.h>
using namespace std;
struct Node{
string hz;
int k;
}sa[300005];
int n;
unsigned long long h[300005];
string s;
bool cmp(Node a,Node b){
return a.hz<b.hz;
}
unsigned long long Hash(int l,int r){
if(l==0)
return h[r];
return h[r]-h[l-1]*pow(29,r-l+1);
}
int find_qz_len(Node x,Node y){
if(x.hz.size()>y.hz.size())
swap(x,y);
if(x.hz[0]!=y.hz[0])
return 0;
int l=1,r=x.hz.size();
while(l<r){
int mid=(l+r+1)/2;
if(Hash(x.k,x.k+mid-1)==Hash(y.k,y.k+mid-1))
l=mid;
else
r=mid-1;
}
return l;
}
int main(){
//cout<<(sizeof(h)+sizeof(sa))/1024/1024<<endl;
cin>>s;
n=s.size();
sa[n].hz="";
for(int i=n-1;i>=0;i--)
sa[i]={s[i]+sa[i+1].hz,i};
sort(sa,sa+n,cmp);
for(int i=0;i<n;i++){
cout<<sa[i].k<<' ';
h[i]=(i==0? 0:h[i-1]*29)+(s[i]-'a');
}
cout<<"\n0 ";
for(int i=1;i<n;i++)
cout<<find_qz_len(sa[i],sa[i-1])<<' ';
return 0;
}