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;
}
相关推荐
这些题目涵盖了动态规划、图论、搜索、排序、数论、字符串处理、组合数学等多个领域,对于提升编程思维和解决实际问题的能力非常有帮助。 离线做题模式意味着用户可以在没有网络连接的情况下,通过下载的文件进行...
BZOJ的题目涉及了计算机科学中的核心算法,如贪心算法、回溯法、分治策略、最短路径算法(Dijkstra和Floyd-Warshall)、最小生成树(Prim和Kruskal)、字符串匹配(KMP和Boyer-Moore)等。通过解决这些题目,不仅...
标题"BZOJ3230相似子串测试数据"指的是一个与在线判题平台BZOJ(BestCoder ZOJ,中国大学算法竞赛在线评测系统)相关的编程问题,具体问题编号为3230,涉及的主要知识点是"相似子串"的搜索和处理。在编程竞赛中,...
八中OJ,又简作BZOJ,以原题巨多而著称,该数据为BZOJ上的1000-1109和1130-1139的测试数据节点,没有题目,有需要题目的可以到https://hydro.ac/d/bzoj/p网站查找对应的题目。
5. **字符串处理**:KMP、Boyer-Moore、Rabin-Karp等字符串匹配算法,以及Manacher's Algorithm等处理回文串的算法,可能会在字符串相关题目中出现。 6. **数学应用**:组合数学、数论(最大公约数、最小公倍数、质...
【标题】"BZOJ全代码"所指的是一份包含BZOJ(BestCoder Zhijiang Online Judge)平台所有编程题目解决方案的压缩文件。BZOJ是一个在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交代码,以检验编程能力...
bzoj部分数据.
BZOJ原题-BZOJP3001-P4000的题目,下载后可以离线做题。
【BZOJ第二部分】是针对BZOJ(北京邮电大学在线评测系统)的一个专题,这个专题主要涵盖了BZOJ平台上的P2001到P3000之间的编程题目。对于想要深入学习算法、提升编程能力的IT从业者或学生来说,这是一个宝贵的资源...
【标题】"bzoj1878数据"是一个在线编程竞赛中的题目数据集,它主要涉及的问题是利用莫队算法(Mo's Algorithm)来解决特定的计算问题。莫队算法,又称莫队法,是一种处理在线询问的高效算法,尤其在处理区间查询和...
【标题】"bzoj problem" 指的是“八中OJ(Online Judge)问题集”,这是一个在线编程竞赛平台的题目合集。八中OJ可能是某所中学的在线编程训练系统,它提供了大量的编程题目供用户练习和挑战,以提升编程能力和算法...
【标题】"BZOJ十连测题面" 涉及的是中国信息技术奥林匹克竞赛(OI)中的在线判题系统BZOJ的一系列题目。OI是针对中学生的编程竞赛,旨在提升他们的计算机科学素养和算法设计能力。BZOJ作为国内知名的在线评测系统,...
4. **字符串处理**:如KMP算法、Manacher算法、Z函数等,用于字符串匹配和模式查找。 5. **数据结构**:包括链表、栈、队列、树(如二叉树、平衡树AVL和红黑树)、哈希表等。 6. **数学问题**:涉及组合数学、数论...
【标题】"Node.js-ZOJCH是BZOJ题库的离线版"揭示了这个项目的核心功能,即提供一个基于Node.js平台的离线版本的BZOJ(BestCoder Judging System)题库。BZOJ是一个在线编程竞赛平台,而ZOJCH则允许用户在没有网络...
「BZOJ1053」反素数详解 「BZOJ1053」反素数问题是数论领域中的一个经典问题,该问题要求我们计算不超过N的最大反质数。所谓反质数,即满足对所有0,g(x)>g(i)的自然数x,其中g(x)表示x的约数个数。 首先,我们...
### BZOJ1034 题解分析 #### 题目概述 题目编号为BZOJ1034的问题,通过一种独特的贪心算法进行解答。本题涉及两个队伍之间的对抗,每个队伍都有自己的实力排序。目标是最大化己方得分。 #### 解题思路与核心代码...
【BZOJ】全称是“北京邮电大学在线评测系统”,它是一个为编程爱好者和参赛者提供在线编程练习和比赛的平台。该平台涵盖了多种算法和编程问题,旨在提升用户的编程技能和解决复杂问题的能力。BZOJ支持C、C++、Java等...
bzoj FFT 的模版
CTSC 2011 无穷图的桥(BZOJ 2307) 题解.ppt
Description 背景 众所周知,DZY是个大学霸,精通数理化。有天,吉丽拿着一道物理题目去问DZY,DZY很快就秒了这题,但是懒得算了,就让你来解决它。 题目描述 现在水平面上有一条无限长的光滑轨道,上面有n个小球...