CodeVS1500 字尾排序

2021-07-23 03:40:31 字數 1162 閱讀 2411

codevs1500 字尾排序

題目描述 description

天凱是mit的新生。prof. handsomeg給了他乙個長度為n的由小寫字母構成的字串,要求他把該字串的n個字尾(suffix)從小到大排序。

何謂字尾?假設字串是s=s1s2……sn,定義ti=sisi+1……sn。t1, t2, …, tn就叫做s的n個字尾。

關於字串大小的比較定義如下(比較規則和pascal中的定義完全相同,熟悉pascal的同學可以跳過此段):

若a是b的字首,則abp。如果apb。

輸入描述 input description

第一行乙個整數n(n<=15000)

第二行是乙個長度為n字串。

輸出描述 output description

輸出檔案包含n行,第i行是乙個整數pi。表示所有的字尾從小到大排序後是tp1, tp2, …, tpn。

樣例輸入 sample input 4

abab

樣例輸出 sample output 3

142

資料範圍及提示 data size & hint

說明:字尾排序後的順序是t3=」ab」, t1=」abab」, t4=」b」, t2=」bab」。所以輸出是3, 1, 4, 2。

字尾陣列水題**

//codevs1500 字尾排序 字尾陣列

#include #include #include #define maxn 16000

using namespace std;

char str[maxn];

int sa[maxn], wa[maxn], wb[maxn], wv[maxn], ws[maxn], n, s[maxn];

bool cmp(int *r, int a, int b, int l)

void da(int *r, int *sa, int n, int m)

{ int i, j, p, *x=wa, *y=wb, *t;

for(i=0;i=0;i--)sa[--ws[x[i]]]=i;

for(j=p=1;p=j)y[p++]=sa[i]-j;

for(i=0;i=0;i--)sa[--ws[wv[i]]]=y[i];

for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i

Codevs 1500 字尾排序 字尾陣列

1500 字尾排序 時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 題目描述 description 天凱是mit的新生。prof.handsomeg給了他乙個長度為n的由小寫字母構成的字串,要求他把該字串的n個字尾 suffix 從小到大排序。何謂字尾?假設字串是s ...

OJ 1500 歸併排序

描述 利用二分歸併排序演算法將讀入的n個數從小到大排序後輸出。輸入輸入的第一行包含1個正整數n,表示共有n個整數需要參與排序。其中n不超過100000。第二行包含n個用空格隔開的正整數,表示n個需要排序的整數。輸出只有1行,包含n個整數,表示從小到大排序完畢的所有整數。請在每個整數後輸出乙個空格,並...

樹上字尾排序

把字尾排序搞到了樹上。乙個節點的字串的定義為 這個節點到根經過的所有字元組成的字串。請將這些字串按字典序排序。輸出排名為i的字串所在的節點。特別地,如果兩個節點所代表的字串完全相同,它們的大小由它們的父親所代表的字串的大小決定,如果仍相同,則由它們編號的大小決定。就是自己的字串是第一關鍵字 第二個關...