`
Ilovejava1
  • 浏览: 17573 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

bzoj1031 [JSOI2007]字符加密Cipher

阅读更多

Description


 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法 
:把需要加密的信息排成一圈,显然,它们有很多种不同的读法。例如下图,可以读作: 
这里写图片描述

JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0把它们按照字符串的大小排序:07JSOI 7JSOI0 I07JSO JSOI07
OI07JS SOI07J读出最后一列字符:I0O7SJ,就是加密后的字符串(其实这个加密手段实在很容易破解,鉴于这是 
突然想出来的,那就^^)。但是,如果想加密的字符串实在太长,你能写一个程序完成这个任务吗?

对于100%的数据字符串的长度不超过100000。

Solution


本蒟蒻的第一题后缀数组SA,纪念一下 
把原串复制一份加在后面,跑出来的所有后缀中长度>=len的按顺序排序,每个取最后一位就ok 
膜来的板子a啊b啊c啊d啊乱七八糟的有点晕,但是想不到更好的替代 
辣鸡csdn,卡屎了

Code


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#define rep(i,st,ed)for(int i=st;i<=ed;++i)
#define drp(i,st,ed)for(int i=st;i>=ed;--i)
#define fill(x,t) memset(x,t,sizeof(x))
#define copy(x,t) memcpy(x,t,sizeof(x))

constint N=200005;

int rank[N],sa[N],h[N];
int b[N],c[N],d[N];

char s[N],ans[N];

void get_sa(int n,int m){
    rep(i,0,m) b[i]=0;
    rep(i,1,n) b[s[i]]++;
    rep(i,1,m) b[i]+=b[i-1];
    drp(i,n,1) c[b[s[i]]--]=i;
int t=0;
    rep(i,1,n){
if(s[c[i]]!=s[c[i-1]]) t++;
        rank[c[i]]=t;
}
int j=1;
while(j<=n){
        rep(i,0,n) b[i]=0;
        rep(i,1,n) b[rank[i+j]]++;
        rep(i,1,n) b[i]+=b[i-1];
        drp(i,n,1) c[b[rank[i+j]]--]=i;
        rep(i,0,n) b[i]=0;
        rep(i,1,n) b[rank[i]]++;
        rep(i,1,n) b[i]+=b[i-1];
        drp(i,n,1) d[b[rank[c[i]]]--]=c[i];
int t=0;
        rep(i,1,n){
if(rank[d[i]]!=rank[d[i-1]]||rank[d[i]]==rank[d[i-1]]&&rank[d[i]+j]!=rank[d[i-1]+j]) t++;
            c[d[i]]=t;
}
        rep(i,1,n) rank[i]=c[i];
if(t==n)break;
        j*=2;
}
    rep(i,1,n)
        sa[rank[i]]=i;
}

void get_height(int n){
int k=0;
    rep(i,1,n){
if(k) k--;
int j=sa[rank[i]-1];
while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k]) k++;
        h[rank[i]]=k;
}
}

int main(void){
scanf("%s", s);int len=strlen(s),m=0;
    drp(i,len,1){
        s[i+len]=s[i]=s[i-1];
        m=std:: max(m,(int)s[i]);
}
    get_sa(len*2,m);
    get_height(len*2);
int j=0;
    rep(i,1,len*2)if(sa[i]<=len) ans[++j]=s[sa[i]+len-1];
    rep(i,1,len)printf("%c",ans[i]);
return0;
}

 本文转载自:http://www.javaxxz.com/thread-359193-1-1.html

分享到:
评论

相关推荐

    BZOJ第一部分

    这些题目涵盖了动态规划、图论、搜索、排序、数论、字符串处理、组合数学等多个领域,对于提升编程思维和解决实际问题的能力非常有帮助。 离线做题模式意味着用户可以在没有网络连接的情况下,通过下载的文件进行...

    BZOJ题目镜像

    BZOJ的题目涉及了计算机科学中的核心算法,如贪心算法、回溯法、分治策略、最短路径算法(Dijkstra和Floyd-Warshall)、最小生成树(Prim和Kruskal)、字符串匹配(KMP和Boyer-Moore)等。通过解决这些题目,不仅...

    BZOJ3230相似子串测试数据

    标题"BZOJ3230相似子串测试数据"指的是一个与在线判题平台BZOJ(BestCoder ZOJ,中国大学算法竞赛在线评测系统)相关的编程问题,具体问题编号为3230,涉及的主要知识点是"相似子串"的搜索和处理。在编程竞赛中,...

    bzoj测试数据118题数据

    八中OJ,又简作BZOJ,以原题巨多而著称,该数据为BZOJ上的1000-1109和1130-1139的测试数据节点,没有题目,有需要题目的可以到https://hydro.ac/d/bzoj/p网站查找对应的题目。

    BZOJ第四部分

    5. **字符串处理**:KMP、Boyer-Moore、Rabin-Karp等字符串匹配算法,以及Manacher's Algorithm等处理回文串的算法,可能会在字符串相关题目中出现。 6. **数学应用**:组合数学、数论(最大公约数、最小公倍数、质...

    BZOJ全代码

    【标题】"BZOJ全代码"所指的是一份包含BZOJ(BestCoder Zhijiang Online Judge)平台所有编程题目解决方案的压缩文件。BZOJ是一个在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交代码,以检验编程能力...

    bzoj 1000-1499

    bzoj部分数据.

    BZOJ第三部分

    BZOJ原题-BZOJP3001-P4000的题目,下载后可以离线做题。

    BZOJ第二部分

    【BZOJ第二部分】是针对BZOJ(北京邮电大学在线评测系统)的一个专题,这个专题主要涵盖了BZOJ平台上的P2001到P3000之间的编程题目。对于想要深入学习算法、提升编程能力的IT从业者或学生来说,这是一个宝贵的资源...

    bzoj1878数据

    【标题】"bzoj1878数据"是一个在线编程竞赛中的题目数据集,它主要涉及的问题是利用莫队算法(Mo's Algorithm)来解决特定的计算问题。莫队算法,又称莫队法,是一种处理在线询问的高效算法,尤其在处理区间查询和...

    bzoj problem

    【标题】"bzoj problem" 指的是“八中OJ(Online Judge)问题集”,这是一个在线编程竞赛平台的题目合集。八中OJ可能是某所中学的在线编程训练系统,它提供了大量的编程题目供用户练习和挑战,以提升编程能力和算法...

    BZOJ十连测题面

    【标题】"BZOJ十连测题面" 涉及的是中国信息技术奥林匹克竞赛(OI)中的在线判题系统BZOJ的一系列题目。OI是针对中学生的编程竞赛,旨在提升他们的计算机科学素养和算法设计能力。BZOJ作为国内知名的在线评测系统,...

    CreationAugust 的BZOJ代码合集

    4. **字符串处理**:如KMP算法、Manacher算法、Z函数等,用于字符串匹配和模式查找。 5. **数据结构**:包括链表、栈、队列、树(如二叉树、平衡树AVL和红黑树)、哈希表等。 6. **数学问题**:涉及组合数学、数论...

    Node.js-ZOJCH是BZOJ题库的离线版

    【标题】"Node.js-ZOJCH是BZOJ题库的离线版"揭示了这个项目的核心功能,即提供一个基于Node.js平台的离线版本的BZOJ(BestCoder Judging System)题库。BZOJ是一个在线编程竞赛平台,而ZOJCH则允许用户在没有网络...

    数论题解:「BZOJ1053」反素数/「Violet5」樱花

    「BZOJ1053」反素数详解 「BZOJ1053」反素数问题是数论领域中的一个经典问题,该问题要求我们计算不超过N的最大反质数。所谓反质数,即满足对所有0,g(x)&gt;g(i)的自然数x,其中g(x)表示x的约数个数。 首先,我们...

    BZOJ泡泡堂题解.doc

    ### BZOJ1034 题解分析 #### 题目概述 题目编号为BZOJ1034的问题,通过一种独特的贪心算法进行解答。本题涉及两个队伍之间的对抗,每个队伍都有自己的实力排序。目标是最大化己方得分。 #### 解题思路与核心代码...

    BZOJ上面的题目以及数据

    【BZOJ】全称是“北京邮电大学在线评测系统”,它是一个为编程爱好者和参赛者提供在线编程练习和比赛的平台。该平台涵盖了多种算法和编程问题,旨在提升用户的编程技能和解决复杂问题的能力。BZOJ支持C、C++、Java等...

    bzoj FFT 的模版

    bzoj FFT 的模版

    CTSC 2011 无穷图的桥(BZOJ 2307) 题解.ppt

    CTSC 2011 无穷图的桥(BZOJ 2307) 题解.ppt

    BZOJ3570 DYZ

    Description 背景 众所周知,DZY是个大学霸,精通数理化。有天,吉丽拿着一道物理题目去问DZY,DZY很快就秒了这题,但是懒得算了,就让你来解决它。 题目描述 现在水平面上有一条无限长的光滑轨道,上面有n个小球...

Global site tag (gtag.js) - Google Analytics