P4051 JSOI2007 字元加密 字尾陣列

2021-09-19 17:07:05 字數 1940 閱讀 7861

喜歡鑽研問題的js 同學,最近又迷上了對加密方法的思考。一天,他突然想出了一種他認為是終極的加密辦法:把需要加密的資訊排成一圈,顯然,它們有很多種不同的讀法。

例如『jsoi07』,可以讀作: jsoi07 soi07j oi07js i07jso 07jsoi 7jsoi0 把它們按照字串的大小排序: 07jsoi 7jsoi0 i07jso jsoi07 oi07js soi07j 讀出最後一列字元:i0o7sj,就是加密後的字串(其實這個加密手段實在很容易破解,鑑於這是突然想出來的,那就^^)。 但是,如果想加密的字串實在太長,你能寫乙個程式完成這個任務嗎?

輸入輸出格式

輸入格式:

輸入檔案包含一行,欲加密的字串。注意字串的內容不一定是字母、數字,也可以是符號等。

輸出格式:

輸出一行,為加密後的字串。

字尾陣列裸題。

把字串接到自己後面變成長度為2*len以後, 如何後求字尾排序得到sa陣列和rak陣列,對len長度的rak陣列直接排序。

#include

#include

#include

using

namespace std;

const

int maxn =

1e6+5;

int tx[maxn]

, sa[maxn]

, rak[maxn]

;int height[maxn]

;int dp[maxn][20

];int lg[maxn]

;char s[maxn]

;int n, m, p, k;

struct node a[maxn]

, b[maxn]

;void

rsort()

for(

int i =

1; i <= n; i++

)for

(int i =

1; i <= m; i++

)for

(int i =

1; i <= n; i++

)for

(int i =

1; i <= m; i++

)for

(int i =

1; i <= n; i++

)for

(int i =

1; i <= m; i++

)for

(int i = n; i >=

1; i--)}

void

ssort()

rak[a[i]

.id]

= p;

}for

(int i =

1; i <= n; i++

) m = p;

}void

solve

(int mx)

ssort()

;for

(int j =

1; j <= n; j <<=1)

ssort()

;if(p == n)}}

char str[maxn]

;struct query q[maxn]

;int

cmp(query a, query b)

intmain()

n =2* len;

solve

(127);

int ans =0;

for(

int i =

1; i <= len; i++

)sort

(q +

1, q + len +

1, cmp)

;for

(int i =

1; i <= len; i++

)printf

("\n");

return0;

}/*jsoi07

*/

P4051 JSOI2007 字元加密

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

洛谷4051 JSOI2007 字元加密(SA)

題目鏈結 真是一道良好的sa模板題 首先,由於涉及到從左邊移動到右邊這個過程,我們不妨直接把字串複製一遍,接在後面。然後直接構造字尾陣列,按排名從小到大,列舉所有的位置,如果這個字尾的起始點是在原串中的,那麼就輸出當前字尾的七十點往後第n個字元,就能直接解決了 include include inc...

JSOI2007 字元加密

如果我們把字串複製乙份,拼接到後面。我們可以發現,字串的所有旋轉之後的串,都會存在於拼接之後的字串字尾當中。多出來的不會影響,很好證明 所以實際上我們對拼接後的字串字尾排序,只要排名為i的sa i 小於等於最開始字串長度len,那麼這個排名就是合法的,所以我們從小到大列舉即可。ac pragma g...