后缀数组模板

mac2025-12-16  6

题目链接:【模板】后缀排序

学习链接: 后缀数组 最详细讲解 [知识点]后缀数组

#include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int N = 1000010; int n, m; int y[N], x[N], c[N], rk[N], sa[N]; char s[N]; void get_sa() { for(int i = 0; i < n; i++) ++c[x[i] = s[i]]; for(int i = 1; i <= m; i++) c[i] += c[i - 1]; for(int i = n - 1; i >= 0; i--) sa[--c[x[i]]] = i; for(int k = 1; k <= n; k <<= 1) { int num = 0; for(int i = n - k; i < n; i++) y[num++] = i; for(int i = 0; i < n; i++) if(sa[i] >= k) y[num++] = sa[i] - k; for(int i = 0; i < m; i++) c[i] = 0; for(int i = 0; i < n; i++) c[x[y[i]]]++; for(int i = 0; i < m; i++) c[i] += c[i - 1]; for(int i = n - 1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i]; swap(x, y); num = 1; x[sa[0]] = 0; for(int i = 1; i < n; i++) x[sa[i]] = (y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + k] == y[sa[i] + k]) ? num - 1 : num++; if(num >= n) break; m = num; } } int main() { scanf("%s", s); n = strlen(s); m = 'z'; get_sa(); for(int i = 0; i < n; i++) { printf("%d", sa[i] + 1); if(i == n - 1) printf("\n"); else printf(" "); } return 0; }
最新回复(0)