longeset_common_profix_array(lcp_array,最长公共前缀数组,高度数组)
来源:互联网 发布:淘宝代销货 编辑:程序博客网 时间:2024/06/04 20:02
#include<iostream>#include<vector>#include<algorithm>#include<string>using namespace std;string s;vector<int> sa;vector<int> grade;vector<int> tmpg;int lcp[1000];int k;int n;bool cmpg(int a, int b){ if (grade[a] != grade[b]) return grade[a] < grade[b]; else { int nexa = a + k <= n ? grade[a + k] : -1; int nexb = b + k <= n ? grade[b + k] : -1; return nexa < nexb; }}void getsa(){ sa.clear(); grade.clear(); tmpg.clear(); n = s.size(); for (int i = 0; i <= n; i++) { sa.push_back(i); grade.push_back(i < n ? s[i] : -1); } tmpg = grade; for (k = 1; k <= n; k*=2) { sort(sa.begin(), sa.end(), cmpg); tmpg[sa[0]] = 0; for (int i = 1; i <= n; i++) { tmpg[sa[i]] = tmpg[sa[i - 1]] + (cmpg(sa[i-1],sa[i])?1:0); } copy(tmpg.begin(), tmpg.end(), grade.begin()); }}void getlcp(){ for (int i = 0; i <= n; i++) { grade[sa[i]] = i; } int h = 0; lcp[sa[0]] = 0; for (int i = 0; i < n; i++) { int j = sa[grade[i] - 1]; if (h > 0) h--; for (; i + h < n&&j + h < n; h++) if (s[i + h] != s[j + h]) break; lcp[grade[j]] = h; }}int main(){ while (cin >> s) { getsa(); getlcp(); for (int i = 0; i < n; i++) cout << lcp[i] << endl; } return 0;}
0 0
- longeset_common_profix_array(lcp_array,最长公共前缀数组,高度数组)
- 后缀数组 + LCP(最长公共前缀)
- 后缀数组--(最长公共前缀)
- 字符串数组最长公共前缀
- hdu4691(后缀数组求最长公共前缀)
- 后缀数组的最长公共前缀
- hdu-4691 最长公共前缀-后缀数组
- 字符串数组的最长公共前缀
- 后缀数组之最长公共前缀
- hdu1403 求最长公共前缀 后缀数组
- 后缀数组 CSU - 1598 最长公共前缀
- hdu 4691 lcp最长公共前缀 后缀数组经典模板
- hdu 4691 最长公共前缀 后缀数组 +lcp+rmq
- LeetCode 找到一个字符串数组的最长公共前缀
- LeetCode -- 求字符串数组中的最长公共前缀
- longest-common-prefix 求字符串数组的最长公共前缀
- 算法#26--查找字符串数组中最长的公共前缀
- 找出一个字符串数组中最长公共前缀字符串
- java开发多线程机制
- MySQL之旅_Day03
- poj 1486(二分图必须边)
- java .class文件详解
- C和C++的区别:
- longeset_common_profix_array(lcp_array,最长公共前缀数组,高度数组)
- 23>IOS数据解析---------之JSON和XML解析
- 2014 Shanghai Regional Room Assignment (DP)
- 模式识别:感知器的实现
- Android真机调试时突然无法显示Logcat信息问题解决参考
- Ubuntu 14.04下安装Golang以及LiteIDE
- 百度地图 Android 定位SDK 开发指南4.2
- 原版windows下载地址
- Hive 的 CSV Serde介绍和使用