完成suffix_array
This commit is contained in:
@@ -17,12 +17,13 @@ namespace TinySTL{
|
||||
template<class InputIterator>
|
||||
//arr - Դ<><D4B4><EFBFBD><EFBFBD>
|
||||
//len - Դ<><D4B4><EFBFBD>鳤<EFBFBD><E9B3A4>
|
||||
//max_len - max_len<65><6E><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>arr<72><72><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ȡֵ<C8A1><D6B5>Χ<EFBFBD><CEA7><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ȡ128<32><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD><6D><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ֵ<EFBFBD><D6B5>
|
||||
suffix_array(InputIterator arr, size_t len, size_t max_len = 128){
|
||||
//max_len - max_len<65><6E><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>arr<72><72><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ȡֵ<C8A1><D6B5>Χ<EFBFBD><CEA7><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD>ȡ256
|
||||
suffix_array(const InputIterator arr, size_t len, size_t max_len = 256){
|
||||
if (max_len > 256)
|
||||
throw std::exception("out of the range");
|
||||
calSuffix(arr, len, max_len);
|
||||
calRank();
|
||||
calHeight(arr, len - 1);
|
||||
calHeight(arr, len);
|
||||
}
|
||||
|
||||
array_type suffixArray(){
|
||||
@@ -36,7 +37,7 @@ namespace TinySTL{
|
||||
}
|
||||
private:
|
||||
template<class InputIteraotr>
|
||||
bool cmp(InputIteraotr arr, size_t a, size_t b, size_t l){
|
||||
bool cmp(const InputIteraotr arr, size_t a, size_t b, size_t l){
|
||||
return arr[a] == arr[b] && arr[a + l] == arr[b + l];
|
||||
}
|
||||
void calRank(){
|
||||
@@ -46,11 +47,11 @@ namespace TinySTL{
|
||||
}
|
||||
}
|
||||
template<class InputIterator>
|
||||
void calSuffix(InputIterator arr, size_t len, size_t max_len){
|
||||
void calSuffix(const InputIterator arr, size_t len, size_t max_len){
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵı<D6B5><C4B1><EFBFBD><EFBFBD>㷨
|
||||
//<2F>㷨ʱ<E3B7A8>临<EFBFBD>Ӷ<EFBFBD> = O(nlg(n))
|
||||
_suffix_array.resize(len);
|
||||
int wa[1024], wb[1024], wv[1024], ws[1024];
|
||||
int wa[256], wb[256], wv[256], ws[256];
|
||||
int i, j, p, *x = wa, *y = wb, *t;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ǰѸ<C7B0><D1B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<CEAA><31><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -84,13 +85,17 @@ namespace TinySTL{
|
||||
}
|
||||
}
|
||||
template<class InputIteraotr>
|
||||
void calHeight(InputIteraotr arr, size_t len)
|
||||
void calHeight(const InputIteraotr arr, size_t len)
|
||||
{
|
||||
/*_height_array.resize(_suffix_array.size());
|
||||
int i, j, k = 0;
|
||||
for (i = 1; i <= len; i++) _rank_array[_suffix_array[i]] = i;
|
||||
for (i = 0; i < len; _height_array[_rank_array[i++]] = k)
|
||||
for (k ? k-- : 0, j = _suffix_array[_rank_array[i] - 1]; arr[i + k] == arr[j + k]; k++);*/
|
||||
_height_array.resize(_suffix_array.size() - 1);
|
||||
for (auto i = 0; i != _suffix_array.size() - 1; ++i){
|
||||
auto n = 0;
|
||||
for (auto j = _suffix_array[i], k = _suffix_array[i + 1];
|
||||
arr[j] == arr[k] && (arr + j) != (arr + len) && (arr + k) != (arr + len);
|
||||
++j, ++k)
|
||||
++n;
|
||||
_height_array[i] = n;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user