bzoj1031: [JSOI2007]字符加密Cipher
来源:互联网 发布:java对象序列化的作用 编辑:程序博客网 时间:2024/06/17 03:29
Description
喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法。例如下图,可以读作:
JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0把它们按照字符串的大小排序:07JSOI 7JSOI0 I07JSO JSOI07 OI07JS SOI07J读出最后一列字符:I0O7SJ,就是加密后的字符串(其实这个加密手段实在很容易破解,鉴于这是突然想出来的,那就^^)。但是,如果想加密的字符串实在太长,你能写一个程序完成这个任务吗?Input
输入文件包含一行,欲加密的字符串。注意字符串的内容不一定是字母、数字,也可以是符号等。
Output
输出一行,为加密后的字符串。
Sample Input
JSOI07Sample Output
I0O7SJHINT
对于100%的数据字符串的长度不超过100000。
题解:
喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法
:把需要加密的信息排成一圈,显然,它们有很多种不同的读法。例如下图,可以读作:
JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0把它们按照字符串的大小排序:07JSOI 7JSOI0 I07JSO JSOI07
OI07JS SOI07J读出最后一列字符:I0O7SJ,就是加密后的字符串(其实这个加密手段实在很容易破解,鉴于这是
突然想出来的,那就^^)。但是,如果想加密的字符串实在太长,你能写一个程序完成这个任务吗?
输入文件包含一行,欲加密的字符串。注意字符串的内容不一定是字母、数字,也可以是符号等。
输出一行,为加密后的字符串。
对于100%的数据字符串的长度不超过100000。
最小表示法
把字符串翻倍 再进行后缀排序
对我们有用的只是长度>=n的后缀
去掉不符合的后缀就是把字符串所有的读法进行排序
因为根据字典序的性质 除非后缀的前n个字符都相同 才会对答案有影响
但如果前n个字符全部相同 那么选哪个后缀都一样
所以不会有影响
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=200000+10;int sa[maxn],x[maxn],y[maxn];int c[maxn];char A[maxn];int n;inline void get_sa(){ int *tp=x,*rnk=y; n=strlen(A+1); int m=300; for(int i=0;i<=m;i++) c[i]=0; for(int i=1;i<=n;i++) tp[i]=(int)A[i],rnk[i]=(int)A[i]; for(int i=1;i<=n;i++) c[tp[i]]++; for(int i=1;i<=m;i++) c[i]+=c[i-1]; for(int i=n;i>=1;i--) sa[c[tp[i]]--]=i; for(int j=1;j<=n;j<<=1){ int p=0; for(int i=n-j+1;i<=n;i++) tp[++p]=i; for(int i=1;i<=n;i++) if(sa[i]>j) tp[++p]=sa[i]-j; for(int i=0;i<=m;i++) c[i]=0; for(int i=1;i<=n;i++) c[rnk[tp[i]]]++; for(int i=1;i<=m;i++) c[i]+=c[i-1]; for(int i=n;i>=1;i--) sa[c[rnk[tp[i]]]--]=tp[i]; swap(rnk,tp); p=1; rnk[sa[1]]=1; for(int i=2;i<=n;i++){ int O1=sa[i]+j>n?-1:tp[sa[i]+j]; int O2=sa[i-1]+j>n?-1:tp[sa[i-1]+j]; rnk[sa[i]]=(O1==O2&&tp[sa[i]]==tp[sa[i-1]])?p:++p; } m=p; if(m>=n) break; }}int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); scanf("%s",A+1); int N=strlen(A+1); for(int i=1;i<=N;i++) A[i+N]=A[i]; get_sa(); for(int i=1;i<=N*2;i++){ if(sa[i]<=N) printf("%c",A[sa[i]+N-1]); }return 0;}
阅读全文
0 0
- BZOJ1031: [JSOI2007]字符加密Cipher
- [Bzoj1031][JSOI2007]字符加密Cipher
- [bzoj1031][JSOI2007]字符加密Cipher
- [BZOJ1031][JSOI2007]字符加密Cipher
- bzoj1031: [JSOI2007]字符加密Cipher
- 【JSOI2007】【BZOJ1031】字符加密Cipher
- BZOJ1031: [JSOI2007]字符加密Cipher
- bzoj1031【JSOI2007】字符加密Cipher
- 【bzoj1031】[JSOI2007]字符加密Cipher
- BZOJ1031: [JSOI2007]字符加密Cipher
- bzoj1031: [JSOI2007]字符加密Cipher
- BZOJ1031[JSOI2007]字符加密Cipher
- bzoj1031 [JSOI2007]字符加密Cipher
- BZOJ1031: [JSOI2007]字符加密Cipher
- BZOJ1031 [JSOI2007] 字符加密Cipher
- bzoj1031: [JSOI2007]字符加密Cipher
- [BZOJ1031][JSOI2007]字符加密Cipher && 后缀数组
- [JSOI2007] [BZOJ1031] 字符加密Cipher - 后缀数组
- 如何提高sql语句的执行效率
- 我的Python日记(小白篇)——关于文件
- 【Scikit-Learn 中文文档】二十九:优化估计器的超参数
- mybatis四大神器之一->增加
- 什么是Servlet容器?
- bzoj1031: [JSOI2007]字符加密Cipher
- 基于DataFrame的StopWordsRemover处理
- opencv多版本共存
- 详解HTML 标签和属性
- 基于DF的Tokenizer分词
- 润乾将excel转成pdf导出
- MySQL的事务、连接池以及数据源
- phpexcel 500错误以及乱码问题
- CCF CSP 201409-2 画图