题意:

给出一个字符串,求将其所有循环串排序之后,每个串的最后一个字符;

字符串长度<=100000;

题解:

后缀数组裸题。。吧

学长拿这个当例题我还差点不会做。。。

反正就是把字符串倍增之后求后缀数组;

然后按后缀数组来扫一遍求解;

难点就是后缀排序(废话!);

这里用的是O(nlogn)的倍增+基数排序方法;

模板纯手写。。一堆for循环也是有毒。。

原理上就是利用倍增的思想,将每次的排序转化为二元组的排序问题;

而二元组的排序问题可以利用基数排序O(n)解决而已;

写代码的时候好费劲啊。。。码力果然不够强;

30行模板4数组,Orz PoPoQQQ 60行SA;

代码:


#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 210000
#define S 256
using namespace std;
char str[N];
int rank[N],tr[N],hash[N],sa[N];
int main()
{int n,m,j,k,cnt;register int i;scanf("%s",str);n=strlen(str);memcpy(str+n,str,sizeof(char)*n);n<<=1;for(i=0;i<n;i++)      hash[str[i]]++;for(i=1,cnt=0;i<S;i++)  if(hash[i]) tr[i]=++cnt;for(i=1;i<S;i++)       hash[i]=hash[i-1]+hash[i];for(i=0;i<n;i++)      rank[i]=tr[str[i]];for(i=0;i<n;i++)      sa[--hash[str[i]]]=i;for(k=2;k<=n;k<<=1){memset(hash,0,sizeof(hash));for(i=0;i<n;i++)    hash[rank[i]]++;for(i=1;i<=n;i++)  hash[i]=hash[i]+hash[i-1];for(i=n-1;i>=0;i--)    if(sa[i]>=(k>>1))tr[sa[i]-(k>>1)]=--hash[rank[sa[i]-(k>>1)]];for(i=1;i<=(k>>1);i++) tr[n-i]=--hash[rank[n-i]];for(i=0;i<n;i++)   sa[tr[i]]=i;for(i=1,cnt=0;i<n;i++)if(rank[sa[i-1]]==rank[sa[i]]&&rank[sa[i-1]+(k>>1)]==rank[sa[i]+(k>>1)])    tr[sa[i]]=tr[sa[i-1]];else tr[sa[i]]=++cnt;memcpy(rank,tr,sizeof(tr));if(cnt==n-1)break;}for(i=0;i<n;i++){if(sa[i]<(n>>1))printf("%c",str[sa[i]+(n>>1)-1]);}return 0;
}

bzoj-1031 字符加密Cipher相关推荐

  1. BZOJ 1031: [JSOI2007]字符加密Cipher( 后缀数组 )

    为什么我的后缀数组跑得这么慢... 把字符串复制一遍放在最后, 然后跑sa, 扫一遍就行了... --------------------------------------------------- ...

  2. 后缀数组(bzoj 1031: [JSOI2007]字符加密Cipher)

    后缀数组主要功能: 长度为n的字符串总共有n个后缀,求这n个后缀的字典序 实现方法:倍增+基数排序,过程就是下面那张表 求log(n)次rank数组,每次的rank数组都可以通过上次的rank数组得出 ...

  3. BZOJ1031: [JSOI2007]字符加密Cipher

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7882  Solved: 3425 [Subm ...

  4. [bzoj1031][JSOI2007]字符加密Cipher

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4175 Solved: 1694 [Submit ...

  5. 【BZOJ1031】[JSOI2007]字符加密Cipher 后缀数组

    [BZOJ1031][JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的 ...

  6. 【BZOJ】1031: [JSOI2007]字符加密Cipher(后缀数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1031 很容易想到这就是将字符串复制到自己末尾然后后缀数组搞出sa然后按区间输出即可. 然后换了下模板 ...

  7. 【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1031 [题意] [题解] 后缀数组模板题; 把整个字符串扩大一倍. 即长度乘2 然后搞 ...

  8. bzoj 1031 [JSOI2007]字符加密Cipher 后缀数组

    题面 题目传送门 解法 后缀数组模板题吧-- 将字符串两倍,然后求一遍sa数组即可 时间复杂度:\(O(n\ log\ n)\) 代码 #include <bits/stdc++.h> # ...

  9. 0宽字符加密_「今日学习」VUE使用RSA加密技术

    1 Vue端搭建 首先我们还是先安装必要的模块哈: npm install jsencrypt --save 接下来我们需要在main.js的配置文件中配置上全局变量哈: import JSEncry ...

最新文章

  1. [NPUCTF2020]Baby Obfuscation [HDCTF2019]MFC
  2. js 触发LinkButton点击事件,执行后台方法
  3. ReactiveCocoa源码拆分解析(四)
  4. mysql 结果保存到文件_将MySQL中sql运行结果保存到文件
  5. java如何确保单线程_java是如何解决单线程之间的通信问题呢?这篇文章给你答案...
  6. 收藏 | 理解卷积神经网络中的自注意力机制
  7. Hash算法中的CRC
  8. 记一次坑爹报错之旅 -bash: /etc/profile: line 11: syntax error near unexpected token
  9. redux源码分析之二:combineReducers.js
  10. 计算机考研 东华大学,东华大学(专业学位)计算机技术考研难吗
  11. dataTransfer.getData()在dragover,dragenter,dragleave中无法获取数据的问题
  12. java 进销存源码_JAVA 进销存管理系统的源码 - 下载 - 搜珍网
  13. mysql图文混排设计方案_平面设计图文混排技巧,看完再也不用担心排版了
  14. 高端存储未来之路在哪?VSP 5000系列带来新答案
  15. 低价战略 革命主机价格将低于299美金
  16. 怎么可以修改pr基本图形中的文字_10、Pr中基本图形安装使用,点点就可以应用高级的字幕...
  17. 大话Linux发展史
  18. Mybatis3 继续盘!
  19. R.I.P,又一位程序员巨佬——左耳朵耗子陨落
  20. “希希敬敬对”团队作业——敏捷冲刺6

热门文章

  1. 一键修改windows远程桌面3389端口
  2. hadoop集群平台的搭建
  3. MYSQL5.7设置账号密码复杂度、密码有效期、账号锁定等策略
  4. 四柱八字大全 php,四柱八字查询表 免费四柱八字查询
  5. android初学者_初学者:如何在Android设备上的打开的应用程序之间切换
  6. 计算机组装与维修2版,计算机组装与维修2版.doc
  7. 【爬虫】Python3搜索并获取电影网站的迅雷下载链接
  8. 流光溢彩PCTV[WLED]
  9. 金岩石:陈晓失误已铸成大错
  10. OpenGL环境配置Win7-64位+freeglut+glew+VS2012