喜歡鑽研問題的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...