描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1031
长度为n的字符串形成环,枚举开头位置,得到n个长度为n的串,将这些串排序,然后按照顺序输出每一个串的最后一个字符.
分析
将原串复制一遍接在自己的后面,这样n个串都在总串里面出现了.
对于这n个串中的两个a,b,如果a<b,那么以a开头的后缀就<以b开头的后缀.
所以我们求一下后缀数组就好了.
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=200000+5; 5 int n; 6 int t1[maxn],t2[maxn],sa[maxn],c[maxn]; 7 char s[maxn]; 8 9 void build_sa(char *s,int n,int m){ 10 int i,k,p,*x=t1,*y=t2,*t; 11 for(i=0;i<m;i++) c[i]=0; 12 for(i=0;i<n;i++) c[x[i]=s[i]-'