#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 *r, int a, int b, int l)
void da(int *r, int n, int m)
}}void calheight(int *r, int n)
}int main()printf("\n");
printf("sa: \n");
for(i=0;i<=len;i++)printf("\n");
printf("rank: \n");
for(i=0;i<=len;i++)printf("\n");
printf("height: \n");
for(i=0;i<=len;i++)printf("\n");
}return 0;
}
這裡num[0~n-1]為有效值 就是輸入的字串稍稍轉化而成的陣列
sa[1~~n]為有效值 sa[i]=a則代表排在第 i 位的是第a個字尾。 a屬於[0~~n-1]
rank[0~~n-1]是有效值 rank[i]=b則代表第 i 個字尾排在第b位 b屬於[1~~n]
height[2~~n]是有效值 height[i]=c 則代表排在第 i 位的字尾和排在第i-1的字尾的最長字首長度是c。
字尾陣列 模板
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...
字尾陣列模板
字尾陣列的模板,這樣說明就很詳細了吧!字尾陣列模板 倍增法 使用方法 1 讀取字串轉換成int陣列,長度為len,下標從0開始 2 在字串末尾加一字典序最小字元,一般為0,並找到最大的字元設為maxa 3 呼叫函式da num,sa,len 1,maxa 1 求得的sa陣列的含義 sa i 為第i字...