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的字串所在的節點。特別地,如果兩個節點所代表的字串完全相同,它們的大小由它們的父親所代表的字串的大小決定,如果仍相同,則由它們編號的大小決定。就是自己的字串是第一關鍵字 第二個關...