题目描述 Description

天凯是MIT的新生。Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序。

何谓后缀?假设字符串是S=S1S2……Sn,定义Ti=SiSi+1……Sn。T1, T2, …, Tn就叫做S的n个后缀。

关于字符串大小的比较定义如下(比较规则和PASCAL中的定义完全相同,熟悉PASCAL的同学可以跳过此段):

若A是B的前缀,则A<B;否则令p满足:A1A2…Ap-1=B1B2…Bp-1,Ap<>Bp。如果Ap<Bp,则A<B;否则A>B。

输入描述 Input Description

第一行一个整数n(n<=15000)

第二行是一个长度为n字串。

输出描述 Output Description

输出文件包含n行,第i行是一个整数pi。表示所有的后缀从小到大排序后是Tp1, Tp2, …, Tpn。

样例输入 Sample Input

4

abab

样例输出 Sample Output

3

1

4

2

数据范围及提示 Data Size & Hint

说明:后缀排序后的顺序是T3=”ab”, T1=”abab”, T4=”b”, T2=”bab”。所以输出是3, 1, 4, 2。

/*后缀数组裸题*/
#include<cstdio>
#include<iostream>
#define N 15010
using namespace std;
int n,m=,s[N],sa[N],t1[N],t2[N],c[N];
bool cmp(int *y,int a,int b,int k){
int a1=y[a],b1=y[b];
int a2=a+k>=n?-:y[a+k];
int b2=b+k>=n?-:y[b+k];
return a1==b1&&a2==b2;
}
void DA(){
int *x=t1,*y=t2;
for(int i=;i<m;i++) c[i]=;
for(int i=;i<n;i++) c[x[i]=s[i]]++;
for(int i=;i<m;i++) c[i]+=c[i-];
for(int i=n-;~i;i--) sa[--c[x[i]]]=i;
for(int k=,p=;k<=n;k*=,m=p,p=){
for(int i=n-k;i<n;i++) y[p++]=i;
for(int i=;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
for(int i=;i<m;i++) c[i]=;
for(int i=;i<n;i++) c[x[y[i]]]++;
for(int i=;i<m;i++) c[i]+=c[i-];
for(int i=n-;~i;i--) sa[--c[x[y[i]]]]=y[i];
swap(x,y);p=;x[sa[]]=;
for(int i=;i<n;i++)
if(cmp(y,sa[i-],sa[i],k)) x[sa[i]]=p-;
else x[sa[i]]=p++;
if(p>=n) break;
}
}
int main(){
char ch[N];
scanf("%d%s",&n,ch);
for(int i=;i<n;i++)
s[i]=ch[i];
DA();for(int i=;i<n;i++)printf("%d ",sa[i]+);
return ;
}

最新文章

  1. javascript组件化
  2. 如何提高nodejs程序的稳定性,健壮性
  3. rsync 不能同不子级目录的问题
  4. Python中将打印输出导向日志文件
  5. PUTTY使用Ctrl+s僵死的问题
  6. poj2105 IP Address(简单题)
  7. 各种开发语言示例调用HTTP接口(示例中默认HTTP接口编码为gb2312)
  8. IOS中http请求使用cookie
  9. 漏网之鱼--HTML&amp;CSS
  10. MultiROM for the XIAOMI MI2S/2C/2! (Kexec HardBoot Enabled with Kexec HardBoot Patch!)
  11. mpeg2文件分析(纯c解析代码)
  12. Git从入门到差不多会用
  13. eclipse手动安装alibaba代码规范插件
  14. Spark 实践——用决策树算法预测森林植被
  15. dll通用操作单元
  16. [javascript][翻译]使用javascript添加css rule
  17. 一次mysql调优过程
  18. Requests Header | Http Header
  19. Odoo中如何复制有唯一性约束的记录?
  20. Disruptor的使用

热门文章

  1. iOS 二维码扫描 通过ZBar ZXing等第三方库
  2. 谈谈对Android中的消息机制的理解
  3. laravel学习笔记(一)
  4. NSValue的个人想法
  5. 【HEVC帧间预测论文】P1.6 A Fast HEVC Inter CU Selection Method Based on Pyramid Motion Divergence
  6. 获取页面URL两种方式
  7. http以及http协议简单理解
  8. (转)Spring的概述
  9. iOS8扩展插件开发配置
  10. END - 提交当前的事务