</pre>sa数组,他保存1....n 的某个排列,sa[2],……,sa[n],并且保证 Suffix(sa[i]) < Suffix(sa[i+1]),1≤i<n。<p></p><p>也就是将 S 的 n 个后缀从小到大进行排序之后把排好序的后缀的开头位置顺次放入 SA 中。</p><p>rank数组,他保存的是每个位置的后缀子串的排名,与sa数组是可以互逆的。</p><p>height数组,保存了后缀数组中相邻两个后缀的最大公共前缀,height[i] 的值是 sa[i-1]和sa[i]的公共前缀长度。</p><p>所有子串,<span class="mop" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; color: rgb(68, 68, 68); font-family: KaTeX_Main; line-height: 20.328px; white-space: nowrap;"><span class="op-symbol small-op mop" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; position: relative; font-family: KaTeX_Size1; top: -5e-06em;">∑</span><span class="vlist" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; display: inline-block;"><span style="margin: 0px 0.05em 0px 0em; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; display: block; height: 0px; position: relative; top: 0.266308em;"><span class="fontsize-ensurer reset-size5 size5" style="margin: 0px; padding: 0px; border: 0px; font-size: 1em; vertical-align: baseline; display: inline-block;"><span style="margin: 0px; padding: 0px; border: 0px; font-size: 0em; vertical-align: baseline;"></span></span><span class="reset-textstyle scriptstyle cramped" style="margin: 0px; padding: 0px; border: 0px; font-size: 0.7em; vertical-align: baseline; display: inline-block;"><span class="mord scriptstyle cramped" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">1</span></span></span><span style="margin: 0px 0.05em 0px 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; display: block; height: 0px; position: relative; top: -0.480908em;"><span class="fontsize-ensurer reset-size5 size5" style="margin: 0px; padding: 0px; border: 0px; font-size: 1em; vertical-align: baseline; display: inline-block;"><span style="margin: 0px; padding: 0px; border: 0px; font-size: 0em; vertical-align: baseline;"></span></span><span class="reset-textstyle scriptstyle uncramped" style="margin: 0px; padding: 0px; border: 0px; font-size: 0.7em; vertical-align: baseline; display: inline-block;"><span class="mord scriptstyle uncramped" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"><span class="mord mathit" style="margin: 0px 0.01968em 0px 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic;">l</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic;">e</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic;">n</span><span class="mord mathit" style="margin: 0px 0.03588em 0px 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic;">g</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic;">t</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic;">h</span></span></span></span><span class="baseline-fix" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; display: inline-table; height: 0px; position: relative; table-layout: fixed;"><span class="fontsize-ensurer reset-size5 size5" style="margin: 0px; padding: 0px; border: 0px; font-size: 1em; vertical-align: baseline; display: inline-block;"><span style="margin: 0px; padding: 0px; border: 0px; font-size: 0em; vertical-align: baseline;"></span></span></span></span></span><span class="mord mathit" style="margin: 0px 0.01968em 0px 0.16667em; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">l</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">e</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">n</span><span class="mord mathit" style="margin: 0px 0.03588em 0px 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">g</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">t</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">h</span><span class="mbin" style="margin: 0px 0px 0px 0.22222em; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; color: rgb(68, 68, 68); font-family: KaTeX_Main; line-height: 20.328px; white-space: nowrap;">−</span><span class="mopen" style="margin: 0px 0px 0px 0.22222em; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; color: rgb(68, 68, 68); font-family: KaTeX_Main; line-height: 20.328px; white-space: nowrap;">(</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">s</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">a</span><span class="mopen" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; color: rgb(68, 68, 68); font-family: KaTeX_Main; line-height: 20.328px; white-space: nowrap;">[</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">i</span><span class="mclose" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; color: rgb(68, 68, 68); font-family: KaTeX_Main; line-height: 20.328px; white-space: nowrap;">]</span><span class="mbin" style="margin: 0px 0px 0px 0.22222em; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; color: rgb(68, 68, 68); font-family: KaTeX_Main; line-height: 20.328px; white-space: nowrap;">+</span><span class="mord mathit" style="margin: 0px 0px 0px 0.22222em; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">h</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">e</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">i</span><span class="mord mathit" style="margin: 0px 0.03588em 0px 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">g</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">h</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">t</span><span class="mopen" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; color: rgb(68, 68, 68); font-family: KaTeX_Main; line-height: 20.328px; white-space: nowrap;">[</span><span class="mord mathit" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; font-family: KaTeX_Math; font-style: italic; color: rgb(68, 68, 68); line-height: 20.328px; white-space: nowrap;">i</span><span class="mclose" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; color: rgb(68, 68, 68); font-family: KaTeX_Main; line-height: 20.328px; white-space: nowrap;">]</span><span class="mclose" style="margin: 0px; padding: 0px; border: 0px; font-size: 16.94px; vertical-align: baseline; color: rgb(68, 68, 68); font-family: KaTeX_Main; line-height: 20.328px; white-space: nowrap;">)</span></p><p></p><pre name="code" class="cpp"></pre><p></p><p>倍增算法</p><p><img src="https://img-my.youkuaiyun.com/uploads/201209/15/1347711026_2313.png" alt="" /></p><p><pre name="code" class="cpp">#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
#include<string.h>
#include<vector>
using namespace std;
const int maxn = (1e5+10)*2;
const double eps = 1e-8;
typedef __int64 LL;
const int MAXN = 100010*2;
int t1[MAXN],t2[MAXN],c[MAXN];
bool cmp(int *r,int a,int b,int l)
{
return r[a]==r[b] && r[a+l] == r[b+l];
}
void da(char str[],int sa[],int rank[],int height[],int n,int m)
{
n++;
int i,j,p,*x = t1,*y = t2;
for(i=0; i<m; i++) c[i]=0;
for(i=0; i<n; i++) c[x[i]=str[i]]++;
for(i=1; i<m; i++) c[i]+=c[i-1];
for(i=n-1; i>=0; i--) sa[--c[x[i]]]=i;
for(j=1; j<=n; j<<=1)
{
p=0;
for(i=n-j; i<n; i++) y[p++]=i;
for(i=0; i<n; i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0; i<m; i++) c[i]=0;
for(i=0; i<n; i++) c[x[y[i]]]++;
for(i=1; i<m; i++) c[i]+=c[i-1];
for(i=n-1; i>=0; i--) sa[--c[x[y[i]]]]=y[i];
swap(x,y);
p=1;
x[sa[0]]=0;
for(i=1; i<n; i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
if(p>=n) break;
m=p;
}
int k=0;
n--;
for(i=0; i<=n; i++) rank[sa[i]]=i;
for(i=0; i<n; i++)
{
if(k) k--;
j=sa[rank[i]-1];
while(str[i+k]==str[j+k]) k++;
height[rank[i]]=k;
}
}
int lastlen;
int rank[MAXN],height[MAXN];
char str[MAXN];
int r[MAXN],sa[MAXN];
int main()
{
while(scanf("%s",str)==1)
{
int len=strlen(str),i;
for(i=0; i<len; i++)
r[i]=str[i];
r[len]=0;
da(str,sa,rank,height,len,128);
for(i=1; i<=len; i++) printf("%d ",sa[i]);
printf("\n");
for(i=0; i<len; i++) printf("%d ",rank[i]);
printf("\n");
}
return 0;
}