[JSOI2007][BZOJ1031] 字元加密Cipher|尾碼數組

來源:互聯網
上載者:User

標籤:

1031: [JSOI2007]字元加密CipherTime Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4296  Solved: 1746
[Submit][Status][Discuss]
Description

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

 

JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0 把它們按照字串的大小排序: 07JSOI 7JSOI0 I07JSO JSOI07 OI07JS SOI07J 讀出最後一列字元:I0O7SJ,就是加密後的字串(其實這個加密手段實在很容易破解,鑒於這是突然想出來的,那就^^)。但是,如果想加密的字串實在太長,你能寫一個程式完成這個任務嗎?

Input

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

Output

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

Sample InputJSOI07Sample OutputI0O7SJHINT

 

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

 

Source

 

裸尾碼數組

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 200005using namespace std;char s[N];int t1[N],t2[N],cc[N],sa[N];int len;inline bool cmp(int *y,int a,int b,int k){    int arank1=y[a];    int brank1=y[b];    int arank2=a+k>=len?-1:y[a+k];    int brank2=b+k>=len?-1:y[b+k];    return arank1==brank1&&arank2==brank2;}inline void make_sa(){    int *x=t1,*y=t2;    int m=256;    for (int i=0;i<m;i++) cc[i]=0;    for (int i=0;i<len;i++) ++cc[x[i]=s[i]];    for (int i=1;i<m;i++) cc[i]+=cc[i-1];    for (int i=len-1;i>=0;i--) sa[--cc[x[i]]]=i;    for (int k=1;k<=len;k<<=1)    {        int p=0;        for (int i=len-k;i<len;i++) y[p++]=i;        for (int i=0;i<len;i++)            if (sa[i]>=k) y[p++]=sa[i]-k;        for (int i=0;i<m;i++) cc[i]=0;        for (int i=0;i<len;i++) ++cc[x[y[i]]];        for (int i=1;i<m;i++) cc[i]+=cc[i-1];        for (int i=len-1;i>=0;i--) sa[--cc[x[y[i]]]]=y[i];        swap(x,y);        m=1; x[sa[0]]=0;        for (int i=1;i<len;i++)             x[sa[i]]=cmp(y,sa[i],sa[i-1],k)?m-1:m++;        if (m>=len) break;    }}int main(){    scanf("%s",s);    len=strlen(s);    for (int i=0;i<len;i++) s[len+i]=s[i];    len=len*2;    make_sa();    for (int i=0;i<len;i++)         if (sa[i]<len/2) putchar(s[sa[i]+len/2-1]);}

 

[JSOI2007][BZOJ1031] 字元加密Cipher|尾碼數組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.