Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <cmath>
- #include <cstring>
- using namespace std;
- const int alphabet = 27;
- class suffix_array{
- public:
- explicit suffix_array(const string& s);
- ~suffix_array();
- private:
- vector<int> suffix;
- size_t size;
- };
- suffix_array::suffix_array(const string &s) {
- size = s.size();
- suffix.resize(size);
- vector<int> cnt(alphabet);
- vector<int> classes(size);
- vector<int> p(size);
- for(int i = 0; i < size; i++){
- cnt[s[i]-'a'] += 1;
- }
- for(int i = 1; i < alphabet; i++){
- cnt[i] += cnt[i-1];
- }
- for(int i = 0; i < size; i++){
- p[cnt[s[i]-'a'] - 1] = i;
- cnt[s[i]-'a'] -= 1;
- }
- classes[p[0]] = 0;
- int num_classes = 1;
- for(int i = 1; i < size; i++){
- if(s[p[i]] != s[p[i-1]]){
- ++num_classes;
- }
- classes[p[i]] = num_classes-1;
- }
- vector<int> pn(size);
- vector<int> cn(size);
- for(int h = 0; (1<<h)-1 < size; h++){
- for(int i = 0; i < size; ++i) {
- pn[i] = p[i] - (1 << h);
- if (pn[i] < 0) {
- pn[i] += size;
- }
- }
- cnt.assign(0, num_classes);
- for(int i = 0; i < size; ++i){
- ++cnt[classes[pn[i]]];
- }
- for (int i=1; i<num_classes; ++i) {
- cnt[i] += cnt[i - 1];
- }
- for (int i=size-1; i>=0; --i) {
- p[--cnt[classes[pn[i]]]] = pn[i];
- }
- cn[p[0]] = 0;
- num_classes = 1;
- for(int i = 1; i < size; ++i) {
- int mid1 = (p[i] + (1<<h)) % size, mid2 = (p[i-1] + (1<<h)) % size;
- if (classes[p[i]] != classes[p[i-1]] || classes[mid1] != classes[mid2])
- ++num_classes;
- cn[p[i]] = num_classes-1;
- }
- for(int i = 0; i < size; i++){
- classes[i] = cn[i];
- }
- }
- for(int i = 0; i < size; i++){
- suffix[i] = p[i]+1;
- }
- bool flag = 1;
- }
- suffix_array::~suffix_array(){}
- int main() {
- string s; // Исходная строка
- cin >> s;
- suffix_array suff(s);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement