Time:2016.05.22
Author:xiaoyimi
转载注明出处谢谢


传送门1
传送门2
思路:
非常裸的题目了,连height数组都不用
把原串后面再接上一个原串,得到一个长度为原串两倍的新串,对它建立后缀数组即可,而且在原串中相对位置一样的两个后缀一定是挨在一起的,不会影响sa和rank数组,最后的答案就是排名从小到大,输出开头下标在原串长度内的答案就可以了
注意:无
代码:

#include<bits/stdc++.h>
#define M 200004
using namespace std;
char s[M];
int len,w[M],sa[M],rank[M],tmp[M],cnt[M],id[M];
void SA(int len,int up)
{int p=0,d=1,*rk=rank,*t=tmp;for (int i=0;i<up;i++) cnt[i]=0;for (int i=0;i<len;i++) cnt[rk[i]=w[i]]++;for (int i=1;i<up;i++) cnt[i]+=cnt[i-1];for (int i=len-1;i>=0;i--) sa[--cnt[rk[i]]]=i;for (;;){for (int i=len-d;i<len;i++) id[p++]=i;for (int i=0;i<len;i++)if (sa[i]>=d) id[p++]=sa[i]-d;for (int i=0;i<up;i++) cnt[i]=0;for (int i=0;i<len;i++) cnt[t[i]=rk[id[i]]]++;for (int i=1;i<up;i++) cnt[i]+=cnt[i-1];for (int i=len-1;i>=0;i--) sa[--cnt[t[i]]]=id[i];swap(rk,t);p=1;rk[sa[0]]=0;for (int i=0;i<len-1;i++)if (sa[i]+d<len&&sa[i+1]+d<len&&t[sa[i]+d]==t[sa[i+1]+d]&&t[sa[i]]==t[sa[i+1]])rk[sa[i+1]]=p-1;else rk[sa[i+1]]=p++;if(p>=len) break;up=p;p=0;d<<=1;}
}
main()
{scanf("%s",s);len=strlen(s);int maxn=0;for (int i=0;i<len;i++)w[i]=s[i],maxn=max(maxn,w[i]);for (int i=0;i<len;i++)w[i+len]=s[i];SA(len<<1,maxn+1);for (int i=0;i<len<<1;i++)if (sa[i]<len)printf("%c",w[sa[i]+len-1]);
}

【Tyvj3500】【BZOJ1031】字符加密,后缀数组相关推荐

  1. bzoj1031 [JSOI2007]字符加密 后缀数组改

    DA后缀数组构造的思想主要的就是倍增 即类似RMQ的双关键字排序 所以就可以用双关键字排序的方法来构造后缀数组 基数排序和快排都可以,鉴于是1e5,直接nlogn就够了 码: #include< ...

  2. bzoj-1031 字符加密Cipher

    题意: 给出一个字符串,求将其所有循环串排序之后,每个串的最后一个字符: 字符串长度<=100000: 题解: 后缀数组裸题..吧 学长拿这个当例题我还差点不会做... 反正就是把字符串倍增之后 ...

  3. 【BZOJ4566】找相同字符,后缀数组

    传送门 思路: 偶然翻到的一个题 苦思冥想算法之时-- 旁边不(jing)会(tong)后缀数组的聪爷爷:这不是后缀数组吗? 赶紧来练一下遗忘的后缀数组(然后手打板子又错了,只能回到博客上重新翻一波以 ...

  4. 【BZOJ4566】找相同字符(后缀数组)

    题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求 SA,height SA,height 那么,考虑一下暴力 在两个串各枚举一个后缀,他们的 lcp lcp ...

  5. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)

    题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...

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

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

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

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

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

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

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

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

最新文章

  1. 记录一次【模仿真实环境】的内网漫游
  2. Harmonic Number(欧拉公式或技巧打表)LightOJ - 1234(求调和级数的和)
  3. day22-面向对象之封装
  4. 【Swift】类似于微博、微信的ActionSheet
  5. 企业云桌面-01-安装第1台域控制器和第1台DNS服务器-011-DC01
  6. 【PHP学习】—利用ajax原理实现登录功能(八)
  7. 网盘纷纷“隐退” 云存储仍是刚需
  8. protues仿真——元件改造
  9. GJB 软件定型测评大纲(模板)
  10. 电子元器件选型——电阻
  11. 空间机器人建模与仿真报告
  12. 批量将WORD转换成PDF文件
  13. HI3798MV200驱动移植
  14. 向日葵能自动连接服务器吗,向日葵远程控制是如何设置连接的
  15. pci-e串口卡linux 驱动下载,PCI/PCIe串口卡并口卡驱动
  16. 为梦想学习,是最酷的事
  17. (C语言)有一个已排好序的数组,要求输入一个数字后,按原来的排序规律将它插入数组
  18. 如何将word文档内容在网页显示方法
  19. 等一场春,行走在心上
  20. hiho 1051 : 补提交卡

热门文章

  1. MySQL指定存储引擎命令_MySQL常用指令(2)——存储引擎
  2. html两行文字右侧对齐,HTML在同一行左右对齐文本
  3. 与素数有关的一些性质及证明(一)
  4. 机器学习十大经典算法之K-Means聚类算法
  5. 浏览器显示linux桌面,如何从Web浏览器远程监视Linux服务器和桌面
  6. mysql本周数据没有填充_MySql查询本周、本月、本年数据(没有数据则补全0)
  7. python字符串查找某个字符_python的字符串
  8. 【mysql问题】can't connect to mysql server on 'localhost' (10060)
  9. 浮动和清浮动,内外边距和margin的坑
  10. day20 java的String