【构造】后缀数组求逆
来源:互联网 发布:java log4j 用法 编辑:程序博客网 时间:2024/04/30 23:04
根据sa[]数组反求原数组,只能26小写字母。
有了sa[],自然有了rank[],从原数组最后的往前考虑,我们尽量要将原数组用小的字符集表示,因为只有26个字母可以表示,那么排名比当前枚举的小一位的的字符串,如果第二位比其小的话,那么排名比当前枚举的小一位的的字符串的首位可与其首位相同,同样的向比它大的考虑一遍则可使字符集尽量小。
#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>const int oo=1073741819;int n,i,a[500005],rk[500006],sa[500006],min,s;char ch[500005];void init(){ int i,k; scanf("%d\n",&n); for (i=1;i<=n;i++) scanf("%d",&sa[i]),rk[sa[i]]=i; k=rk[n],a[n]=0; for (i=k;i>=2;i--) if (rk[sa[i-1]+1]<rk[sa[i]+1]) a[sa[i-1]]=a[sa[i]];else a[sa[i-1]]=a[sa[i]]-1; for (i=k;i<=n-1;i++) if (rk[sa[i+1]+1]>rk[sa[i]+1]) a[sa[i+1]]=a[sa[i]];else a[sa[i+1]]=a[sa[i]]+1; min=oo; for (i=1;i<=n;i++) if (a[i]<min) min=a[i]; for (i=1;i<=n;i++) printf("%c",a[i]-min+97);}int main(){ freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); init(); return 0;}
- 【构造】后缀数组求逆
- 后缀数组求LCP
- 利用后缀数组构造后缀树
- hdu4691 后缀数组求lcp
- 倍增法求后缀数组
- 后缀数组求rank数组,sa数组
- 由后缀pos数组构造height数组
- 转帖-后缀数组构造原来如此简单
- 构造后缀数组的DC3算法实现
- 【*】后缀数组(dc3算法构造)
- 后缀数组的DC3构造法
- 后缀数组 (由倍增算法构造)
- 倍增算法实现后缀数组的构造
- 2倍倍增算法构造后缀数组
- 【BZOJ4319】cerc2008 Suffix reconstruction【构造】【后缀数组】
- 后缀数组倍增构造算法说解
- 后缀数组求最长重复子串
- 后缀数组求最长重复子串
- VC++语法理解
- n4:lua sample
- Javascript 那些事《序》
- 今年你想盈利吗?
- amba_device使用分析
- 【构造】后缀数组求逆
- 【搬家】VB.NET开发全功能串口调试助手
- G711 G723 G729线路占多少带宽问题
- 设置输入法弹出时,处于焦点状态的控件所在界面保持原样
- Singleton 单例模式 -IOS开发
- pointer endianess sizeof()
- 给android设备增加串口功能
- 深入JVM之根类加载器的测试
- Oracle约束的4种状态小结