javascript
[JSOI2007]字符加密
題目描述
喜歡鉆研問題的JS 同學,最近又迷上了對加密方法的思考。一天,他突然想出了一種他認為是終極的加密辦法:把需要加密的信息排成一圈,顯然,它們有很多種不同的讀法。
例如‘JSOI07’,可以讀作: JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0 把它們按照字符串的大小排序: 07JSOI 7JSOI0 I07JSO JSOI07 OI07JS SOI07J 讀出最后一列字符:I0O7SJ,就是加密后的字符串(其實這個加密手段實在很容易破解,鑒于這是突然想出來的,那就^^)。 但是,如果想加密的字符串實在太長,你能寫一個程序完成這個任務嗎?
輸入格式
輸入文件包含一行,欲加密的字符串。注意字符串的內容不一定是字母、數字,也可以是符號等。
輸出格式
輸出一行,為加密后的字符串。
輸入輸出樣例
輸入 #1復制
輸出 #1復制
I0O7SJ說明/提示
對于40%的數據字符串的長度不超過10000。
對于100%的數據字符串的長度不超過100000。
題解:
樣例分析:
JSOI07排序后
每一個字符串取最后一位:I0O7SJ
既然涉及了字符串的排序,就應該想到后綴數組,我們想想這個題,要求按照字符串的大小對各個排列的字符串進行排序。各個排列的字符串我們完全可以用后綴字符串來表示,再用樣例分析:
JSOI07的后綴字符串有:
每一列的最后一位為什么沒有?別急,因為字符串是一個環狀,所以每一列的最后一位也就是第一位的前一位,所以根據第一位向前推就行
答案還是我們要的I0O7SJ
但是真的就這樣做沒有問題嗎?
當s=“bnabn”
我們會發現后綴字符串bn會排在bnabn前面,但是bn對應的是bnbna,應該是小于bnabn的,因為我們用的后綴字符串,導致缺失的串會影響結果,那該怎么辦?
有一個小技巧,我們將s變成原來的兩倍
s=“bnabn”+“bnabn”=bnabnbnabn
這樣的話,我們取s的后綴字符串就會包含所有通過s變化的串,但是同時也會多出一些部分,會影響結果嗎?
并不會
我們只需要觀察所有sa[i] ≤n的,而對于這一部分,我們在前n位上一定是有序的,后面的一定不會對前n位的順序造成影響,這也是我們需要的部分
代碼:
連續提交三次都未果?洛谷炸了??
總結
以上是生活随笔為你收集整理的[JSOI2007]字符加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后缀数组(后续)
- 下一篇: Deltix Round, Spring