巴蜀1359 后缀数组
2016-11-26 21:05
357 查看
Description 我们定义一个字符串的后缀suffix(i)表示从s[i]到s[length(s)]这段子串。 后缀数组(Suffix
array)SA[i]中存放着一个排列,满足suffix(sa[i])定义height[i]表示suffix(sa[i])与suffix(sa[i-1])之间的最长公共前缀长度,其中height[1]=0
你的任务就是求出SA和height这两个数组。字符串长度<=200000 Input 一行,为描述中的字符串(仅会出现小写字母)
Output 共两行,每行n个数,第一行为sa[i],第二行为height[i],其中每行的数均用空格隔开
后缀数组。
发现网上很多模板都是错的,可以试一下’aaaaa’。
array)SA[i]中存放着一个排列,满足suffix(sa[i])定义height[i]表示suffix(sa[i])与suffix(sa[i-1])之间的最长公共前缀长度,其中height[1]=0
你的任务就是求出SA和height这两个数组。字符串长度<=200000 Input 一行,为描述中的字符串(仅会出现小写字母)
Output 共两行,每行n个数,第一行为sa[i],第二行为height[i],其中每行的数均用空格隔开
后缀数组。
发现网上很多模板都是错的,可以试一下’aaaaa’。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char s[200010]; int sa[200010],cnt[200010],rank[200010],height[200010],t1[200010],t2[200010],n,m; int main() { int i,j,k,p,q,*x=t1,*y=t2; scanf("%s",s+1); n=strlen(s+1); m='z'; for (i=1;i<=n;i++) cnt[x[i]=s[i]]++; for (i=2;i<=m;i++) cnt[i]+=cnt[i-1]; for (i=n;i;i--) sa[cnt[x[i]]--]=i; for (k=1;k<=n;k<<=1) { p=0; for (i=n-k+1;i<=n;i++) y[++p]=i; for (i=1;i<=n;i++) if (sa[i]-k>=1) y[++p]=sa[i]-k; for (i=1;i<=m;i++) cnt[i]=0; for (i=1;i<=n;i++) cnt[x[y[i]]]++; for (i=2;i<=m;i++) cnt[i]+=cnt[i-1]; for (i=n;i;i--) sa[cnt[x[y[i]]]--]=y[i]; swap(x,y); p=1; x[sa[1]]=1; for (i=2;i<=n;i++) if (y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]) x[sa[i]]=p; else x[sa[i]]=++p; if ((m=p)>=n) break; } for (i=1;i<=n;i++) rank[sa[i]]=i; for (i=1,k=0;i<=n;i++) { if (k) k--; if (rank[i]==1) { k=height[1]=0; continue; } j=sa[rank[i]-1]; while (s[i+k]==s[j+k]) k++; height[rank[i]]=k; } for (i=1;i<=n;i++) printf("%d%c",sa[i],i==n?'\n':' '); for (i=1;i<=n;i++) printf("%d%c",height[i],i==n?'\n':' '); }
相关文章推荐
- POJ1743 Musical Theme(后缀数组,高度数组分组)
- POJ 3693 Maximum repetition substring 后缀数组求重复次数最多子串
- HDU 4029 Distinct Sub-matrix [后缀数组]
- Codeforces 452E Three strings 后缀数组 + 并查集
- POJ 1743 Musical Theme(后缀数组求不可重叠最长重复子串)
- 后缀数组经典例题
- hdu 5442 F - Favorite Donut 后缀数组 / 字符串の最小表示法+kmp
- 后缀数组 UVA 11107 Life Forms
- EOJ1805 POJ2217 最长公共子串(后缀数组+高度数组)
- hdu 4436 str2int 后缀数组、后缀自动机
- poj 1743 Musical Theme 后缀数组
- 【后缀数组之应用】【待续】
- 后缀数组题目小结
- 【POJ3294】 Life Forms (后缀数组+二分)
- 后缀数组
- HiHocoder1415 : 后缀数组三·重复旋律3 & Poj2774:Long Long Message
- Next数组 kmp 前缀后缀
- poj 1743后缀数组入门
- SPOJ DISUBSTR 后缀数组
- 【tyvj 1860】 后缀数组模板