티스토리 뷰

알고리즘/BOJ

[백준] 13264 접미사 배열2

세진짱 2018. 6. 27. 18:03

suffix array를 이용하는 문제다

suffix array에 관한건 구글링을....!

원리는 1,2,4,8...,len 까지 이전에 구한것을 이용해 O(1)만에 계속 구해가는 것이다


suffix array에 대한 설명이 없는점 죄송 ㅎㅎ 어렵네요 이거..

저도 아직 완벽하게 정리가 안된지라 ㅎㅎ

좀 더 공부해서 나중에 이론게시판에 쓰는걸로..!


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main() {
    string s; cin >> s;
    int n = s.size(), l = 1;
    vector<int> sa(n), g(n + 1), ng(n + 1);
    g[n] = ng[n] = -1;
    for (int i = 0; i < n; i++) sa[i] = i;
    for (int i = 0; i < n; i++) g[i] = s[i];
    auto cmp = [&](int u, int v) {
        if (g[u] == g[v]) return g[u+l] < g[v+l];
        return g[u] < g[v];
    };
    while (l < n) {
        sort(sa.begin(), sa.end(), cmp);
        ng[sa[0]] = 0;
        for (int i = 0; i < n - 1; i++) ng[sa[i + 1]] = ng[sa[i]] + cmp(sa[i], sa[i + 1]);
        g = ng;
        l <<= 1;
    }
    for (int i = 0; i < n; i++printf("%d\n", sa[i]);
}
cs


'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 10748 Cow Hopscotch  (0) 2018.06.29
[백준] 10750 Censoring  (0) 2018.06.28
[백준] 13904 과제  (0) 2018.06.27
[백준] 15594 Out of place  (0) 2018.06.26
[백준] 14965 Lozinke  (0) 2018.06.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함