為什麼一開始要再字串末尾多算個0呢
因為當開始分關鍵字比較的時候 最後要組成兩個
字元所以要多個0 什麼你有問我為什麼填0
因為0小啊 先處理唄
雖然 sa是根據每個字元確定的大小
也就是排布的每個字元的排名
但是在初次求第二關鍵字排序的時候
可以使用sa的結論
首先吧sa後面的0排到最前面
那麼0的數量 也就是從n-j到n開區間 都是0作為第二關鍵字的區域
也就是這句話
for(p=0,i=n-j;i
i++) y[p++]=i;
這一句
for(int i=0;i
i++)
if(sa[i]>=j)y[p++]=sa[i]-j;
是表示
當0已經排完了
現在再把非0的排進去
如何排進去呢?
我們看
我們從1-n開區間列舉
如果sai大於等於j說明排到第i位的字尾的位置是大於等於j,大於等於
現在的列舉長度的
那麼就把他們放到y
也就是第二關鍵字排名陣列中 並將其值記錄為本字串的開始位置sa[i]-j;
for(i=0;i
i++) wv[i]=x[y[i]];
由於y陣列中是按照第二關鍵字排序後存放的開始位置的陣列
那麼當我按照y從x陣列中把值提取出來付給wv陣列時 就相當於
把要比較的長度為2的倍增一倍的陣列放到wv中去了
接下來就用下面的四個for迴圈來按第一關鍵字對合併後的字串進行排序,最後更新sa道理同上面對字串第乙個字元進行排序的四個for迴圈。
for(i=0;i0;//將新的桶清0 1
for(i=0;i//2
for(i=1;i1];//3
for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];//4
1:盛放j=1 長度為2 由於是按照低位排過序後的陣列放入的wv 而wv存放的是第一關鍵字的值 為後續排序做準備
2:按照第一關鍵字的順序將其裝桶標記
3:按照第一關鍵字的順序計算字首和
4: 對於每個wv 是先按照第二關鍵字排序順序裝入的ws 也就是基數排序的本質
此時在2句又按照第一關鍵字的值(儲存的是第一關鍵字的值)排好了序
每次– 逆序處理
此時得到的sa陣列 就是乙個在以第一二關鍵字合併的情況下按照其大小按照加上第一關鍵字的新順序從高到低
講y陣列(記錄的是初始位置)的值付給sa
表示字串排序第i個位於y[i]
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;ix[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
int cmp(int
*r,int a,int b,int l)
乙個cmp
最後再來看下cmp函式的作用
如果y也就是原來的x陣列下a位置的和b位置的相等 並且第二關鍵字也相等
那麼就會返回1
返回1就會讓這段字元的實質排名為p-1 返回0表示不相等那麼就說明兩段不相等
讓其等於p 則兩段字元的排名相同
最終的p值 就代表我一共有排到了幾 其中有可能有排名相等的項
那麼這個p也就是其中下一迴圈的m值 也就是下一次迴圈
其中每個單關鍵字的排名不會超過m 儲存到x陣列中
魔板:
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
int n,m;
int *t,sa[1010],a[1010],b[1010],ms[1010],mv[1010];
char aa[50];
void lsd(int n,int *x,int *y,int *ws,int *wv)
return;
}int main()
簡單魔板 Special judge
description 魔板由8個大小相同方塊組成,分別用塗上不同顏色,用1到8的數字表示。其初始狀態是 1 2 3 4 8 7 6 5 對魔板可進行三種基本操作 a操作 上下行互換 8 7 6 5 1 2 3 4 b操作 每次以行迴圈右移乙個 4 1 2 3 5 8 7 6 c操作 中間四小塊順時...
魔板問題(搜尋)
時間限制 1 sec 記憶體限制 64 mb 提交 23 解決 6 提交 狀態 討論版 命題人 admin 題目描述 據說能使持有者成為世界之主的上古神器隱藏在魔板空間,魔板由8個同樣大小的方塊組成,每個方塊顏色均不相同,按順時針方向依次寫下各方塊的顏色代號,例如序列 1,2,3,4,5,6,7,8...
BFS 雜湊 Magic Squares 魔板
題目描述 在成功地發明了魔方之後,拉比克先生發明了它的二維版本,稱作魔板。這是一張有8個大小相同的格仔的魔板 1 2 3 4 8 7 6 5 我們知道魔板的每乙個方格都有一種顏色。這8種顏色用前8個正整數來表示。可以用顏色的序列來表示一種魔板狀態,規定從魔板的左上角開始,沿順時針方向依次取出整數,構...