JSOI2007 字元加密

2021-10-24 13:19:37 字數 1915 閱讀 5442

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

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

輸入格式

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

輸出格式

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

輸入輸出樣例

輸入 #1複製

jsoi07
輸出 #1複製

i0o7sj
說明/提示

對於40%的資料字串的長度不超過10000。

對於100%的資料字串的長度不超過100000。

樣例分析:

jsoi07排序後

07jsoi

7jsoi0

i07jso

jsoi07

oi07js

soi07j

每乙個字串取最後一位:i0o7sj

既然涉及了字串的排序,就應該想到字尾陣列,我們想想這個題,要求按照字串的大小對各個排列的字串進行排序。各個排列的字串我們完全可以用字尾字串來表示,再用樣例分析:

jsoi07的字尾字串有:

js0i07

soi07

oi07

i0707

7 按照大小排序後: 077

i07js0i07

oi07

soi07

每一列的最後一位為什麼沒有?別急,因為字串是乙個環狀,所以每一列的最後一位也就是第一位的前一位,所以根據第一位向前推就行

答案還是我們要的i0o7sj

但是真的就這樣做沒有問題嗎?

當s=「bnabn」

我們會發現字尾字串bn會排在bnabn前面,但是bn對應的是bnbna,應該是小於bnabn的,因為我們用的字尾字串,導致缺失的串會影響結果,那該怎麼辦?

有乙個小技巧,我們將s變成原來的兩倍

s=「bnabn」+「bnabn」=bnabnbnabn

這樣的話,我們取s的字尾字串就會包含所有通過s變化的串,但是同時也會多出一些部分,會影響結果嗎?

並不會我們只需要觀察所有sa[i] ≤n的,而對於這一部分,我們在前n位上一定是有序的,後面的一定不會對前n位的順序造成影響,這也是我們需要的部分

連續提交三次都未果?洛谷炸了??

JSOI2007 字元加密

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

JSOI2007 字元加密

抽了點時間複習了一下字尾陣列 這道題其實不難 將字串拉環成鏈,然後再求字尾陣列即可 這樣字尾排序出來,與原題所要求的順序相符 可以自行推理 include include include include using namespace std const int maxn 2e5 char str ...

JSOI2007 字元加密

學了字尾陣列 做了字尾陣列裸題23333 對於這題來說 只需要把長度為len的字串變成長度為2 len的字串 跑一遍字尾陣列 然後就可以輸出結果辣!快樂!上 板子打得醜qaq include usingnamespacestd charss 1000005 intc 1000005 rank 100...