=====后缀数组复习===== ===什么是后缀数组=== 将一个字符串的所有后缀按照字典序从小到大排序,我们记sa[i]表示排名第i的后缀在原串的开头位置。 ===后缀数组可以用来干什么=== 处理一系列关于子串/回文串/后缀子串/重复子串/公共子串/子串相似度的问题 ===后缀数组模版=== build_sa函数 const int Len = 200000+5; char s[Len]; int c[Len],sa[Len],val[Len],q[Len],newval[Len]; bool is_same(int a,int b,int hl,int len) { return val[a]==val[b]&&((a+hl>len&&b+hl>len)||(a+hl=0;i--)sa[--c[val[i]]] = i; for(int d=1;;d++) { int hl = 1<<(d-1),id = 0; for(i = 0;i=len)q[id++] = sa[i]; for(i = 0;i=hl)q[id++] = sa[i]-hl; for(i = 0;i= 0;i--)sa[--c[val[q[i]]]] = q[i]; lim = 0; for(i = 0;i 求height(排名为i的后缀和排名为i-1的后缀的最长公共前缀)和rank(开头为i的后缀的排名)的函数 void build_rank(int len) { for(int i= 0;i