Сжатие координат
int x[n], all[n];
for (int i = 0; i < n; ++i)
scanf("%d", &x[i]), all[i] = x[i];
sort(all, all + n);
m = unique(all, all + n) - all; // теперь m - число различных координат
for (int i = 0; i < n; ++i)
x[i] = lower_bound(all, all + m, x[i]) - all;
...
сжатая координата x -> исходная координата all[x]
Статическое выделение памяти
struct node {
...
void* operator new(size_t);
} nodes[MAX_NODES], *pos = nodes;
void* node::operator new(size_t) {
return (void*) (pos++);
}
Суффиксный массив
int safe(int x) {
return x >= n ? x - n : x;
}
void build() {
for (int i = 0; i < n; ++i) {
c[i] = s[i] - 31;
begin[c[i] + 1]++;
suf[i] = i;
}
for (int i = 0; i + 1 < A; ++i)
begin[i + 1] += begin[i];
for (int l = 0; l < n; l = (l ? l * 2 : 1)) {
for (int i = 0; i < n; ++i) {
pos = safe(suf[i] - l + n);
new_suf[begin[c[pos]]++] = pos;
}
for (int i = 0, total = 0; i < n; ++i) {
if ((i == 0) || (c[new_suf[i - 1]] != c[new_suf[i]]) || (c[safe(new_suf[i - 1] + l)] != c[safe(new_suf[i] + l)]))
begin[total++] = i;
new_c[new_suf[i]] = total - 1;
}
memcpy(suf, new_suf, n * sizeof(suf[0]));
memcpy(c, new_c, n * sizeof(c[0]));
}
}