P4051 字尾陣列

2021-10-03 02:53:25 字數 1070 閱讀 2441

給你乙個字串,輸出加密後的字串。

例如『jsoi07』,可以讀作: jsoi07 soi07j oi07js i07jso 07jsoi 7jsoi0 把它們按照字串的大小排序: 07jsoi 7jsoi0 i07jso jsoi07 oi07js soi07j 讀出最後一列字元:i0o7sj,就是加密後的字串。

資料範圍:字串的長度不超過

給乙個字串

然後考慮字尾排序,輸出想要的東西。

設那麼當字尾長度大於

簡單分析一下:

設現在有乙個字尾是

我們想要的其實是

觀察發現

然後掏出字尾陣列板子,求出sa就行了。

反覆看了幾遍都是5個0,結果1e5是re,開成1e6才過去。

#includeusing namespace std ;

typedef long long ll ;

const int maxn = 1e6 + 5 ;

int rk[maxn << 1] , sa[maxn << 1] , height[maxn << 1] ;

int tmp[maxn << 1] , cnt[maxn] ;

char s[maxn] ;

void suffixarray(int n , int m)

sa[tmp[cnt[0] = 0]] = j = 0 ;

for(int i = 1 ; i < n ; i ++)

memcpy(rk , sa , n * sizeof(int)) ;

memcpy(sa , tmp , n * sizeof(int)) ;

if(j >= n - 1) break ;

}height[0] = 0 ;

for(int i = 0 , k = 0 , j = rk[0] ; i < n - 1 ; i ++ , k ++)

while(~k && s[i] != s[sa[j - 1] + k])

height[j] = k -- , j = rk[sa[j] + 1] ;

}int main()

P4051 JSOI2007 字元加密 字尾陣列

喜歡鑽研問題的js 同學,最近又迷上了對加密方法的思考。一天,他突然想出了一種他認為是終極的加密辦法 把需要加密的資訊排成一圈,顯然,它們有很多種不同的讀法。例如 jsoi07 可以讀作 jsoi07 soi07j oi07js i07jso 07jsoi 7jsoi0 把它們按照字串的大小排序 0...

P3809 模板 字尾排序 (字尾陣列sa )

題意 讀入乙個長度為 n的由大小寫英文本母或數字組成的字串,請把這個字串的所有非空字尾按字典序從小到大排序,然後按順序輸出字尾的第乙個字元在原串中的位置。位置編號為 1到 n。資料範圍 n 1e6 解法 題目要求的是排名第x的字尾在原串中的位置,其實就是字尾陣列中的sa陣列,算出來直接輸出就行了 c...

洛谷 P3809 模板 字尾排序 字尾陣列

題目描述 讀入乙個長度為 n n 的由大小寫英文本母或數字組成的字串,請把這個字串的所有非空字尾按字典序從小到大排序,然後按順序輸出字尾的第乙個字元在原串中的位置。位置編號為 1 1 到 n n 輸入輸出格式 輸入格式 一行乙個長度為 n n 的僅包含大小寫英文本母或數字的字串。輸出格式 一行,共n...