博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ1031][JSOI2007]字符加密Cipher 后缀数组
阅读量:4654 次
发布时间:2019-06-09

本文共 1313 字,大约阅读时间需要 4 分钟。

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1031

求字符串排名的问题,直接上后缀数组。

由于这个字符串是环形的,我们把它倍增一下就好了。然后发现其实就是求sa数组裸题,后缀长度大于等于len的后缀就可以对应原来的一种字符串,直接输出就好了……

1 #include
2 #include
3 #include
4 using namespace std; 5 int n,m; 6 char s[200010]; 7 int rk[200010],sa[200010],tmp[200010],c[200010]; 8 bool inline cmp(int *r,int a,int b,int l){ 9 return r[a]==r[b]&&r[a+l]==r[b+l];10 }11 void Getsa(){12 m=300;13 for(int i=0;i<=m;i++) c[i]=0;14 for(int i=1;i<=n;i++) c[rk[i]=s[i]]++;15 for(int i=1;i<=m;i++) c[i]+=c[i-1];16 for(int i=n;i>=1;i--) sa[c[rk[i]]--]=i;17 int p;18 for(int i=1;i<=n;i<<=1){19 p=0;20 for(int j=n-i+1;j<=n;j++) tmp[++p]=j;21 for(int j=1;j<=n;j++) if(sa[j]>i) tmp[++p]=sa[j]-i;22 for(int j=0;j<=m;j++) c[j]=0;23 for(int j=1;j<=n;j++) c[rk[tmp[j]]]++;24 for(int j=1;j<=m;j++) c[j]+=c[j-1];25 for(int j=n;j>=1;j--) sa[c[rk[tmp[j]]]--]=tmp[j];26 swap(rk,tmp);27 rk[sa[1]]=p=1;28 for(int j=2;j<=n;j++) rk[sa[j]]=cmp(tmp,sa[j],sa[j-1],i)?p:++p;29 if(p>=n) break;30 m=p;31 }32 }33 int main(){34 scanf("%s",s+1);35 int len=strlen(s+1);36 for(int i=1;i

 

转载于:https://www.cnblogs.com/halfrot/p/7475273.html

你可能感兴趣的文章
瑞士 -- 德语 德国 -- 德语 卢森堡 -- 德语 奥地利 -- 德语 丹麦 -- 丹麦语 挪威 -- 挪威语 爱尔兰 -- 爱尔兰语 荷兰 -- 荷兰语 比利时 -- 荷兰语...
查看>>
背景颜色设置
查看>>
推荐一款帮助负载均衡/DNS轮询服务器组使用的文件同步工具
查看>>
常用的CSS命名规则
查看>>
约数个数定理&约数和定理
查看>>
Oracle EBS数据定义移植工具:FNDLOAD
查看>>
判素数
查看>>
extjs4.1:两个combobox的联动
查看>>
百度地图瓦片工具:定义坐标
查看>>
jmeter控制器--交替控制器
查看>>
hdu 5365 Run
查看>>
SVN 常用命令一览表
查看>>
css中可继承和不可继承属性
查看>>
980. Unique Paths III
查看>>
git 博客搭建
查看>>
7-13 求链式线性表的倒数第K项(20 分)
查看>>
快速排序
查看>>
一口一口吃掉Struts(十)——异常自动处理机制
查看>>
并查集,以及可拆分并查集
查看>>
六个优雅的 Linux 命令行技巧
查看>>