博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】1031 [JSOI2007]字符加密Cipher
阅读量:5739 次
发布时间:2019-06-18

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

【算法】后缀数组

【题解】把数组复制一遍然后SA处理即可。

#include
#include
#include
using namespace std;const int maxn=300010;int sa[maxn],base[maxn],y[maxn],x[maxn],n;char s[maxn];void build_sa(int m){ //初始基排-4步 for(int i=1;i<=m;i++)base[i]=0;//初始化 for(int i=1;i<=n;i++)base[x[i]=s[i]+1]++;//累积 for(int i=2;i<=m;i++)base[i]+=base[i-1];//叠加排名 for(int i=n;i>=1;i--)sa[base[x[i]]--]=i;//排名赋值(愈前愈前,但无所谓) for(int k=1;k<=n;k<<=1)//倍增 { int p=0; //排序第二关键字 for(int i=n-k+1;i<=n;i++)y[++p]=i;//没有第二关键字默认为$ for(int i=1;i<=n;i++)if(sa[i]>k)y[++p]=sa[i]-k;//根据sa决定第二关键字排名,注意k即以后才能作为第二关键字 sa[i]-k取对应第一关键字(后缀) //排序第一关键字 for(int i=1;i<=m;i++)base[i]=0; for(int i=1;i<=n;i++)base[x[i]]++; for(int i=2;i<=m;i++)base[i]+=base[i-1]; for(int i=n;i>=1;i--)sa[base[x[y[i]]]--]=y[i];//根据y顺序(倒)赋值SA //把x放进y,然后更新x swap(x,y); p=1;x[sa[1]]=1; for(int i=2;i<=n;i++) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p:++p;//判重 if(p>=n)break;//排名各不相同即退出 m=p; }}int main(){ scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;i++)s[n+i]=s[i]; n*=2; build_sa(256); for(int i=1;i<=n;i++)if(sa[i]<=n/2)printf("%c",s[sa[i]+n/2-1]); return 0;}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/6659480.html

你可能感兴趣的文章
SharePoint 读取 Site Columns 的数据并绑定到DropdownList
查看>>
使用 axios 详解
查看>>
通信基站(dfs回溯,思维)
查看>>
nginx web加密访问
查看>>
iOS - Regex 正则表达式
查看>>
第 68 章 Logical Volume Manager (LVM)
查看>>
膝盖中了一箭之康复篇-第八个月暨2月份目标总结
查看>>
IPA提交APPStore问题记录(一)
查看>>
有利于seo优化的网站地图不能取巧
查看>>
快照产品体验优化
查看>>
ASCII
查看>>
ibatis SqlMap not found
查看>>
Android SD卡创建文件和文件夹失败
查看>>
Ubuntu 14.04 vsftp refusing to run with writable root inside chroot问题解决方法
查看>>
Intellij IDEA远程调试tomcat
查看>>
hadoop的学习论坛
查看>>
Struts2 学习小结
查看>>
烂泥:wordpress迁移到docker
查看>>
.扒渣机的性能及优势 
查看>>
Linux下磁盘保留空间的调整,解决df看到的空间和实际磁盘大小不一致的问题
查看>>