【UOJ 35】 后缀排序|后缀数组 *3
来源:互联网 发布:mac itunes怎么下载 编辑:程序博客网 时间:2024/05/17 08:17
可以在开始处理rank数组!
注意字符集大小
#include <cstdio>#include <cstring>using namespace std;const int MAXN=1e5+100;char s[MAXN];int n,rank[MAXN],sa[MAXN],tmp[MAXN],cnt[MAXN],sec[MAXN],height[MAXN];void get_sa(){int nn=0;for(int i=1;i<=n;i++) cnt[s[i]-'a'+1]++;//printf("fva");for(int i=1;i<=26;i++) cnt[i]+=cnt[i-1];for(int i=1;i<=n;i++) sa[cnt[s[i]-'a'+1]--]=i;nn=rank[sa[1]]=1;for(int i=2;i<=n;i++){if(s[sa[i]]!=s[sa[i-1]]) nn++;rank[sa[i]]=nn;}for(int i=0;i<=26;i++) cnt[i]=0;//printf("%d\n",nn);for(int k=1;k<=n&&nn<n;k<<=1){int top=0;for(int i=n-k+1;i<=n;i++) sec[++top]=i;for(int i=1;i<=n;i++) if(sa[i]>k) sec[++top]=sa[i]-k;for(int i=0;i<=nn;i++) cnt[i]=0;for(int i=1;i<=n;i++) cnt[rank[i]]++;for(int i=1;i<=nn;i++) cnt[i]+=cnt[i-1];for(int i=n;i>=1;i--) sa[cnt[rank[sec[i]]]--]=sec[i];top=tmp[sa[1]]=1;for(int i=2;i<=n;i++){if(rank[sa[i]]!=rank[sa[i-1]]||rank[sa[i]+k]!=rank[sa[i-1]+k]) top++;tmp[sa[i]]=top;}nn=top;for(int i=1;i<=n;i++) rank[i]=tmp[i];}int k=0;for(int i=1;i<=n;i++){if(k) k--;int j=sa[rank[i]-1];while(j+k<=n&&i+k<=n&&s[j+k]==s[i+k]) k++;height[rank[i]]=k;}}int main(){scanf("%s",s+1);n=strlen(s+1);get_sa();for(int i=1;i<=n;i++) printf("%d ",sa[i]);printf("\n");for(int i=2;i<=n;i++) printf("%d ",height[i]);return 0;}
0 0
- 【UOJ 35】 后缀排序|后缀数组 *3
- 【UOJ 35】 后缀排序|后缀数组
- 【UOJ 35】 后缀排序|后缀数组 *2
- UOJ #35 后缀排序(后缀数组)
- uoj#35: 后缀排序
- 【uoj #35】后缀排序
- 【uoj 35】后缀排序
- [省选前题目整理][UOJ 35]后缀排序(后缀数组)
- uoj#35. 后缀排序 后缀数组
- Uoj #35. 后缀排序(后缀数组)
- UOJ #35. 后缀排序(后缀数组模板题)
- UOJ #35. 后缀排序 后缀数组模板题
- UOJ #35. BZOJ 1031 后缀排序 后缀数组模板
- Uoj#35. 后缀排序
- uoj #35. 后缀排序
- uoj P35 后缀排序
- uoj 35 后缀数组first blood
- UOJ#35 —— 后缀排序
- iOS 应用安装失败原因排查
- 深入学习JVM笔记三 GC算法与种类
- 笔试题--字符处理
- android进程和线程
- 欢迎使用CSDN-markdown编辑器
- 【UOJ 35】 后缀排序|后缀数组 *3
- 从tcp原理角度理解Broken pipe和Connection reset by peer的区别
- 线程、多线程与线程池总结
- 根据年和月计算这个月有多少天的算法
- mysql数据库服务启动和停止命令介绍
- 乐观锁
- Android使用ViewPager实现左右循环滑动及轮播效果
- 使用faster rcnn训练自己的数据(py-faster-rcnn )
- POI导出excel,基于jgrid的公共组件