【uoj #35】后缀排序
2016-03-06 11:37
218 查看
这是一道模板题
这是一道模板题。
读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置。位置编号为 1 到 n。
除此之外为了进一步证明你确实有给后缀排序的超能力,请另外输出 n−1 个整数分别表示排序后相邻后缀的最长公共前缀的长度。
直接上模板了……机房要关门了……我要吃饭了……
//2016.4.7才发现这个是CE的代码……
这是一道模板题。
读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置。位置编号为 1 到 n。
除此之外为了进一步证明你确实有给后缀排序的超能力,请另外输出 n−1 个整数分别表示排序后相邻后缀的最长公共前缀的长度。
直接上模板了……机房要关门了……我要吃饭了……
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 100000 + 5; int sa[MAXN],rank[MAXN],tmp[MAXN]; int n,k; char c[MAXN]; bool cmp_sa(int a,int b) { if(rank[a] != rank[b]) return rank[a] < rank[b]; else { int x = a + k <= n ? rank[a + k] : -1; int y = b + k <= n ? rank[b + k] : -1; return x < y; } } void make_sa(char s[]) { for(int i = 0;i <= n;i ++) { rank[i] = i < n ? s[i] : -1; sa[i] = i; } for(k = 1;k <= n;k <<= 1) { sort(sa,sa + n + 1,cmp_sa); tmp[sa[0]] = 0; for(int i = 1;i <= n;i ++) tmp[sa[i]] = tmp[sa[i - 1]] + cmp_sa(sa[i - 1],sa[i]); for(int i = 0;i <= n;i ++) rank[i] = tmp[i]; } return; } int lcp[MAXN]; void make_lcp(char s[]) { for(int i = 1;i < n;i ++) rank[sa[i]] = i; int h = 0; lcp[0] = 0; for(int i = 0;i < n;i ++) { int j = sa[rank[i] - 1]; if(h) h--; for(;i + h < n && j + h < n;h ++) if(s[i + h] != s[j + h]) break; lcp[rank[i] - 1] = h; } return; } int main() { scanf("%s",c); n = strlen(c); make_sa(c); for(int i = 1;i <= n;i ++) printf("%d ",sa[i] + 1); puts(""); make_lcp(c); for(int i = 1;i < n;i ++) printf("%d ",lcp[i]); return 0; }
//2016.4.7才发现这个是CE的代码……
相关文章推荐
- 笔记:batch normalization:accelerating deep network training by reducing internal covariate shift
- Android中Service(服务)详解
- POJ 1113
- PAT (Advanced Level) Practise 1032 Sharing (25)
- 音乐播放器中Service的使用
- 软件测试homework2
- javascript下兼容都有哪些
- POJ 3176 简单DP
- POJ 3176 简单DP
- PAT (Advanced Level) Practise 1031 Hello World for U (20)
- 怎样更好的设计你的REST API之基于REST架构的Web Service设计及REST框架实现
- jquery:has()选择器
- webservice之wsdl详解
- HDU 1418 抱歉
- 51nod 1015 水仙花数
- 2016寒假训练——尺取法
- 研究生毕业前要完成的事
- Effective Java 第一条:考虑用静态工厂方法替代构造器
- Hibernate注解
- iOS Xcode, 解决“Could not insert new outlet connection”的问题。