[模板]后缀数组

来源:互联网 发布:哈尔滨公交车查询软件 编辑:程序博客网 时间:2024/06/13 10:59
#include <stdio.h>#include <iostream>#include <set>#define N 1007#include <string.h>#include <algorithm>using namespace std;string s = "abracadabra";int n , k;int r[N];int tmp[N];int sa[N];bool compare_sa(int i, int j) {    if (r[i] != r[j]) return r[i] < r[j];    else {        int ri = i + k <= n ? r[i+k] : -1;        int rj = j + k <= n ? r[j+k] : -1;        return ri < rj;    }}void construct_sa() {    n = s.size();    for (int i=0; i<=n; i++) {        sa[i] = i;        r[i] = i < n ? s[i] : -1;    }    for (k=1; k<=n; k*=2) {        sort(sa, sa+n+1, compare_sa);        tmp[sa[0]] = 0;        for (int i=1; i<=n; i++) {            tmp[sa[i]] = tmp[sa[i-1]] + (compare_sa(sa[i-1], sa[i]) ? 1: 0);        }        for (int i=0; i<=n; i++) {            r[i] = tmp[i];        }    }}int main() {    freopen("in.txt", "r", stdin);    construct_sa();    for (int i=0; i<=n; i++) {        cout << sa[i] << " ";    } cout << endl;}

0 1
原创粉丝点击