From eba5f8f563a93593fab57d19e2010e217193cde5 Mon Sep 17 00:00:00 2001 From: TooYoungTooSimp <6648049+TooYoungTooSimp@users.noreply.github.com> Date: Wed, 22 Mar 2017 11:25:14 +0800 Subject: [PATCH] bzoj 1031 --- OnlineJudges/lydsy/1031.cpp | 54 +++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 OnlineJudges/lydsy/1031.cpp diff --git a/OnlineJudges/lydsy/1031.cpp b/OnlineJudges/lydsy/1031.cpp new file mode 100644 index 0000000..414dbcb --- /dev/null +++ b/OnlineJudges/lydsy/1031.cpp @@ -0,0 +1,54 @@ +#include +#include +const int N = int(2e5 + 3); +char str[N]; +int sa[N], rank[N], height[N], c[N]; +template +inline void swap(T &x, T &y) +{ + T t = x; + x = y; + y = t; +} +inline bool In_equal(const int *x, const int i, const int j, const int k, const int n) +{ + int ti = i + k < n ? x[i + k] : -1, tj = j + k < n ? x[j + k] : -1; + return x[i] == x[j] && ti == tj; +} +int main() +{ + scanf("%s", str); + int len = int(strlen(str)); + memcpy(str + len, str, len); + len <<= 1; + int *x = rank, *y = height, r = 256, yn; + for (int i = 0; i < r; ++i) c[i] = 0; + for (int i = 0; i < len; ++i) ++c[str[i]]; + for (int i = 1; i < r; ++i) c[i] += c[i - 1]; + for (int i = len - 1; i >= 0; --i) sa[--c[str[i]]] = i; + r = 1; + x[sa[0]] = 0; + for (int i = 1; i < len; ++i) + x[sa[i]] = str[sa[i]] == str[sa[i - 1]] ? r - 1 : r++; + for (int k = 1; r < len; k <<= 1) + { + yn = 0; + for (int i = len - k; i < len; ++i) y[yn++] = i; + for (int i = 0; i < len; ++i) + if (sa[i] >= k) y[yn++] = sa[i] - k; + for (int i = 0; i < r; ++i) c[i] = 0; + for (int i = 0; i < len; ++i) ++c[x[y[i]]]; + for (int i = 1; i < r; ++i) c[i] += c[i - 1]; + for (int i = len - 1; i >= 0; --i) sa[--c[x[y[i]]]] = y[i]; + swap(x, y); + r = 1; + x[sa[0]] = 0; + for (int i = 1; i < len; ++i) + x[sa[i]] = In_equal(y, sa[i], sa[i - 1], k, len) ? r - 1 : r++; + } + for (int i = 0; i < len; ++i) rank[i] = x[i]; + for (int i = 0; i < len; i++) + if (sa[i] < len >> 1) + putchar(str[sa[i] + (len >> 1) - 1]); + return 0; +} \ No newline at end of file