字尾陣列
大佬的講解
字尾陣列 da(倍增)演算法求 sa[n] 與 rank[n] (時間o(nlogn),空間o(n))
如果字尾陣列中不是字元而是數的話,要讓這些數大於0,末尾位置等於0.。。
字串要記得最後要是結束符
倍增法模板(時間o(nlogn),空間o(n))(spoj - subst1
)
/* str為當前長度為len的字串,陣列下標從1開始suffix[i]表示從字串中的下標為i的字元到最後乙個字元形成的子串。
比如abcdab suffix[3]=cdab;
suffix[4]=dab;
rank陣列儲存字尾按照字典序從小到大的排名。
rank[i]表示suffix[i]的字尾排名
比如bbbba rank[5]=1;表示從第五個字元開始的字尾排名第一(最小)
sa[i]表示排名為i的字尾的下標(排名為i的字尾的首字母),和rank陣列為逆運算(sa已知排名求位置,rank知道位置求排名)
比如bbbba sa[1]=5;
height[i]表示 排名為i的字尾和排名為i-1的字尾的最長公共字首的長度
比如aaaaa 排名為3的字尾為aaa,排名為2的字尾為aa
所以height[3]=2;*/
#include #include
#include
#include
typedef
long
long
ll;using
namespace
std;
const
int maxn=200010
;int
wa[maxn],wb[maxn],wv[maxn],ws[maxn];
char
str[maxn];
int cmp(int *r,int a,int b,int
l)void da(const
char r,int sa,int n,int m) //
n為len+1,m一般比陣列中最大的數大一點即可
return;}
intsa[maxn],rank[maxn],height[maxn];// sa是通過字尾排名找到它在字串中的位置,rank是根據位置找到字尾排名,兩者相逆,該模板中sa陣列的最小值為1。
void calheight(const
char *r,int *sa,int
n)int
main()
printf(
"%lld\n
",ans);
}return0;
}
dc3模板(( 時間複雜度o(n),空間複雜度o(3n) ))(poj 2406)
#include#include
#include
#include
#define maxn 1000003
#define f(x) ((x)/3+((x)%3==1?0:tb))
#define g(x) ((x)=0;i--) b[--ws[wv[i]]]=a[i];
return;
}void dc3(int *r,int *sa,int n,int m)
return(height[askrmq(a+1,b)]);
}char c[maxn];
struct pipp[maxn];
int main()
{int i,j,len,m,p,k,le,ri,mid,minn;
while(scanf("%s",c)!=eof){
if(c[0]=='.')
break;
len=strlen(c);
minn=len;
for(i=0;i
字尾陣列 模板
char s n 陣列的長度要為兩倍的 int n n全域性變數為字元陣列的長度的 int sa n 2 high n 2 rank n 2 tmp n 2 top n 2 void makesa void lcp int main gets s int len strlen s s len get...
字尾陣列模板
過了期末了,繼續寫acm題 自己寫的字尾陣列模板。k,len,rank,sa,tmp,都要寫在外面,這樣就不用來回折騰了。也是使用倍增法來做的,得到乙個sa,儲存了字尾排在第i位的字尾的起始位置。因為空也算乙個字尾,所以函式中都是 len include include include includ...
模板 字尾陣列
include include includeusing namespace std const int max 20001 int num max int sa max rank max height max int wa max wb max wv max wd max int cmp int ...