倍增算法实现后缀数组
2012-06-04 21:24
323 查看
reference:http://baike.baidu.com/view/1240197.htm
in:string out:suffix array
in:string out:suffix array
#include<stdio.h> #include<stdlib.h> #define maxn 100 void changeabc(int* r, char* c)//将字符串转换为数字 { int i = 0; for(;*c != '\0';c++, i++) if(*c <= 'Z' && *c >= 'A') r[i] = *c - 64; else if(*c <= 'z' && *c >= 'a') r[i] = *c - 70; else printf("error\n"); r[i] = 0; } bool cmp(int *r, int i, int j, int l) { return r[i] == r[j] && r[i + l] == r[j + l]; } void suffix_ar(int* r, int* sa, int n, int m) { int wa[maxn], i, secondkey[maxn], rank[maxn], j, *y = secondkey, *x = rank, *t, p; for(i = 0; i <= m; i++) wa[i] = 0; for(i = 0; i <= n - 1; i++) wa[x[i] = r[i]]++; for(i = 0; i <= m; i++) wa[i] += wa[i - 1]; for(i = n - 1; i >=0; i--) sa[--wa[x[i]]] = i; for(p = 1, j = 1; p < n; j *= 2, m = p) { for(p = 0, i = n - 1; i >= n - j; i--, p++) y[p] = i; for(i = 0; i < n; i++) if(sa[i] >= j) y[p++] = sa[i] - j;//second key for(i = 0; i <= m; i++) wa[i] = 0; for(i = 0; i <= n - 1; i++) wa[x[y[i]]]++; for(i = 0; i <= m; i++) wa[i] += wa[i - 1]; for(i = n - 1; i >=0; i--) sa[--wa[x[y[i]]]] = y[i]; for(x = t, x = y, y = t, x[sa[0]] = 0, i = 1, p = 1; i < n; i++) x[sa[i]] = cmp(y, sa[i], sa[i - 1], j)?p - 1:p++; } } main() { int r[maxn], sa[maxn], i, j; char c[100]; printf("please enter the string:"); scanf("%s", c); for(i = 0; c[i] != '\0'; i++); changeabc(r, c); suffix_ar(r, sa, i + 1, 52); printf("suffix array:"); for(j = 1; j <= i; j++) printf("%d ", sa[j]); printf("\n"); for(j = 1; j <= i; j++) printf("%s\n", c + sa[j]); system("pause"); return 0; }
相关文章推荐
- 倍增算法实现后缀数组的构造
- 实现后缀数组的倍增算法和DC3算法
- 关于后缀数组的倍增算法和height数组
- 2倍倍增算法构造后缀数组
- 2倍倍增算法构造后缀数组
- 后缀数组的倍增法实现
- 最近公共祖先(LCA)算法实现过程 【Tarjan离线+倍增在线+RMQ】
- 后缀数组 倍增算法 出自http://www.cnblogs.com/staginner/archive/2012/02/02/2335600.html
- 后缀数组 倍增算法 出自http://www.cnblogs.com/staginner/archive/2012/02/02/2335600.html
- 后缀数组 倍增算法模板
- 白话经典算法系列之五 归并排序的实现
- Java通过列索引获取Excel其对应列的字母(两种实现算法)
- 实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3 这些都要找出来
- 国密SM2非对称算法与实现
- 简单LRU算法实现缓存大小的限制策略
- 三种LCA算法(一):Doubly算法(倍增算法)
- 【面试算法系列】已知二叉树的前序和中序遍历重建二叉树 - C语言实现
- 图像处理常用算法GPU实现三:基于模板匹配的边缘检测
- 利用Python实现一个感知机学习算法
- Python八大常见排序算法定义、实现及时间消耗效率分析