【Tyvj3500】【BZOJ1031】字符加密,后缀数组
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】字符加密,后缀数组相关推荐
- bzoj1031 [JSOI2007]字符加密 后缀数组改
DA后缀数组构造的思想主要的就是倍增 即类似RMQ的双关键字排序 所以就可以用双关键字排序的方法来构造后缀数组 基数排序和快排都可以,鉴于是1e5,直接nlogn就够了 码: #include< ...
- bzoj-1031 字符加密Cipher
题意: 给出一个字符串,求将其所有循环串排序之后,每个串的最后一个字符: 字符串长度<=100000: 题解: 后缀数组裸题..吧 学长拿这个当例题我还差点不会做... 反正就是把字符串倍增之后 ...
- 【BZOJ4566】找相同字符,后缀数组
传送门 思路: 偶然翻到的一个题 苦思冥想算法之时-- 旁边不(jing)会(tong)后缀数组的聪爷爷:这不是后缀数组吗? 赶紧来练一下遗忘的后缀数组(然后手打板子又错了,只能回到博客上重新翻一波以 ...
- 【BZOJ4566】找相同字符(后缀数组)
题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求 SA,height SA,height 那么,考虑一下暴力 在两个串各枚举一个后缀,他们的 lcp lcp ...
- 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)
题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...
- 【BZOJ1031】[JSOI2007]字符加密Cipher 后缀数组
[BZOJ1031][JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的 ...
- 【BZOJ】1031: [JSOI2007]字符加密Cipher(后缀数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1031 很容易想到这就是将字符串复制到自己末尾然后后缀数组搞出sa然后按区间输出即可. 然后换了下模板 ...
- BZOJ 1031: [JSOI2007]字符加密Cipher( 后缀数组 )
为什么我的后缀数组跑得这么慢... 把字符串复制一遍放在最后, 然后跑sa, 扫一遍就行了... --------------------------------------------------- ...
- 后缀数组(bzoj 1031: [JSOI2007]字符加密Cipher)
后缀数组主要功能: 长度为n的字符串总共有n个后缀,求这n个后缀的字典序 实现方法:倍增+基数排序,过程就是下面那张表 求log(n)次rank数组,每次的rank数组都可以通过上次的rank数组得出 ...
最新文章
- 记录一次【模仿真实环境】的内网漫游
- Harmonic Number(欧拉公式或技巧打表)LightOJ - 1234(求调和级数的和)
- day22-面向对象之封装
- 【Swift】类似于微博、微信的ActionSheet
- 企业云桌面-01-安装第1台域控制器和第1台DNS服务器-011-DC01
- 【PHP学习】—利用ajax原理实现登录功能(八)
- 网盘纷纷“隐退” 云存储仍是刚需
- protues仿真——元件改造
- GJB 软件定型测评大纲(模板)
- 电子元器件选型——电阻
- 空间机器人建模与仿真报告
- 批量将WORD转换成PDF文件
- HI3798MV200驱动移植
- 向日葵能自动连接服务器吗,向日葵远程控制是如何设置连接的
- pci-e串口卡linux 驱动下载,PCI/PCIe串口卡并口卡驱动
- 为梦想学习,是最酷的事
- (C语言)有一个已排好序的数组,要求输入一个数字后,按原来的排序规律将它插入数组
- 如何将word文档内容在网页显示方法
- 等一场春,行走在心上
- hiho 1051 : 补提交卡
热门文章
- MySQL指定存储引擎命令_MySQL常用指令(2)——存储引擎
- html两行文字右侧对齐,HTML在同一行左右对齐文本
- 与素数有关的一些性质及证明(一)
- 机器学习十大经典算法之K-Means聚类算法
- 浏览器显示linux桌面,如何从Web浏览器远程监视Linux服务器和桌面
- mysql本周数据没有填充_MySql查询本周、本月、本年数据(没有数据则补全0)
- python字符串查找某个字符_python的字符串
- 【mysql问题】can't connect to mysql server on 'localhost' (10060)
- 浮动和清浮动,内外边距和margin的坑
- day20 java的String