提交记录 17464


用户 题目 状态 得分 用时 内存 语言 代码长度
AntiLeaf 1006. 【模板题】后缀排序 Wrong Answer 0 43.846 ms 5608 KB C++11 3.21 KB
提交时间 评测时间
2022-03-06 20:26:24 2022-03-06 20:26:50
#include <bits/stdc++.h>

constexpr int maxn = 1000005, l_type = 0, s_type = 1;

using namespace std;

using vec = vector<int>;

bool is_lms(vec &tp, int x) {
	return x > 0 && tp[x] == s_type && tp[x - 1] == l_type;
}

bool equal_substr(int *s, int x, int y, vec &tp) {
	do {
		if (s[x] != s[y])
			return false;
		x++;
		y++;
	} while (!is_lms(tp, x) && !is_lms(tp, y));

	return s[x] == s[y];
}

void induced_sort(int *s, vec &sa, vec &tp, vec &buc, vec &lbuc, vec &sbuc, int n, int m) {
	for (int i = 0; i <= n; i++)
		if (sa[i] > 0 && tp[sa[i] - 1] == l_type)
			sa[lbuc[s[sa[i] - 1]]++] = sa[i] - 1;
		
	for (int i = 1; i <= m; i++)
		sbuc[i] = buc[i] - 1;
	
	for (int i = n; ~i; i--)
		if (sa[i] > 0 && tp[sa[i] - 1] == s_type)
			sa[sbuc[s[sa[i] - 1]]--] = sa[i] - 1;
}

vec sais(int *s, int len, int m) {
	int n = len - 1;

	vector<int> tp(n + 1), pos(n + 1), name(n + 1, -1), sa(n + 1, -1);
	vector<int> buc(m + 1), lbuc(m + 1), sbuc(m + 1);

	for (int i = 0; i <= n; i++)
		buc[s[i]]++;
	
	for (int i = 1; i <= m; i++) {
		buc[i] += buc[i - 1];

		lbuc[i] = buc[i - 1];
		sbuc[i] = buc[i] - 1;
	}

	tp[n] = s_type;
	for (int i = n - 1; ~i; i--) {
		if (s[i] < s[i + 1])
			tp[i] = s_type;
		else if (s[i] > s[i + 1])
			tp[i] = l_type;
		else
			tp[i] = tp[i + 1];
	}

	int cnt = 0;
	for (int i = 1; i <= n; i++)
		if (tp[i] == s_type && tp[i - 1] == l_type)
			pos[cnt++] = i;
	
	// memset(sa, -1, sizeof(int) * (n + 1));
	for (int i = 0; i < cnt; i++)
		sa[sbuc[s[pos[i]]]--] = pos[i];
	induced_sort(s, sa, tp, buc, lbuc, sbuc, n, m);

	// memset(name, -1, sizeof(int) * (n + 1));
	int lastx = -1, namecnt = 1;
	bool flag = false;
	
	for (int i = 1; i <= n; i++) {
		int x = sa[i];

		if (is_lms(tp, x)) {
			if (lastx >= 0 && !equal_substr(s, x, lastx, tp))
				namecnt++;
			
			if (lastx >= 0 && namecnt == name[lastx])
				flag = true;

			name[x] = namecnt;
			lastx = x;
		}
	}
	name[n] = 0;

	int *t = new int[cnt];
	int p = 0;
	for (int i = 0; i <= n; i++)
		if (name[i] >= 0)
			t[p++] = name[i];

	vector<int> tsa;
	if (!flag) {
		tsa.resize(cnt);

		for (int i = 0; i < cnt; i++)
			tsa[t[i]] = i;
	}
	else
		tsa = move(sais(t, cnt, namecnt));
	
	lbuc[0] = sbuc[0] = 0;
	for (int i = 1; i <= m; i++) {
		lbuc[i] = buc[i - 1];
		sbuc[i] = buc[i] - 1;
	}

	sa.assign(n + 1, -1);

	// memset(sa, -1, sizeof(int) * (n + 1));
	for (int i = cnt - 1; ~i; i--)
		sa[sbuc[s[pos[tsa[i]]]]--] = pos[tsa[i]];
	induced_sort(s, sa, tp, buc, lbuc, sbuc, n, m);
	
	return sa;
}

void get_sa(char *s, int n, int *sa, int *rnk, int *height) {
	static int a[maxn];

	for (int i = 1; i <= n; i++)
		a[i - 1] = s[i];
	
	a[n] = '$';

	vector<int> t = move(sais(a, n + 1, 256));
	copy(t.begin(), t.end(), sa);
	// memcpy(sa, t, sizeof(int) * (n + 1));

	sa[0] = 0;
	for (int i = 1; i <= n; i++)
		rnk[++sa[i]] = i;
		
	for (int i = 1, k = 0; i <= n; i++) {
		if (k)
			k--;

		while (s[i + k] == s[sa[rnk[i] - 1] + k])
			k++;

		height[rnk[i]] = k;
	}
}

char str[maxn];
int s[maxn], sa[maxn], rnk[maxn], height[maxn];

int main() {
	scanf("%s", str + 1);
	int n = strlen(str + 1);
	
	get_sa(str, n, sa, rnk, height);

	for (int i = 1; i <= n; i++)
		printf("%d%c", sa[i], i < n ? ' ' : '\n');
	
	for (int i = 2; i <= n; i++)
		printf("%d%c", height[i], i < n ? ' ' : '\n');

	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #139.01 us60 KBWrong AnswerScore: -100

Subtask #1 Testcase #245.24 us60 KBAcceptedScore: 0

Subtask #1 Testcase #345.86 us60 KBAcceptedScore: 100

Subtask #1 Testcase #446.03 us60 KBAcceptedScore: 0

Subtask #1 Testcase #546.52 us60 KBAcceptedScore: 0

Subtask #1 Testcase #645.84 us60 KBAcceptedScore: 0

Subtask #1 Testcase #742.714 ms4 MB + 928 KBAcceptedScore: 0

Subtask #1 Testcase #843.846 ms4 MB + 932 KBAcceptedScore: 0

Subtask #1 Testcase #943.779 ms4 MB + 848 KBAcceptedScore: 0

Subtask #1 Testcase #1028.499 ms3 MB + 176 KBAcceptedScore: 0

Subtask #1 Testcase #1128.475 ms3 MB + 144 KBAcceptedScore: 0

Subtask #1 Testcase #1240.243 ms4 MB + 340 KBAcceptedScore: 0

Subtask #1 Testcase #1340.51 ms4 MB + 308 KBAcceptedScore: 0

Subtask #1 Testcase #1440.322 ms4 MB + 252 KBAcceptedScore: 0

Subtask #1 Testcase #1540.428 ms4 MB + 320 KBAcceptedScore: 0

Subtask #1 Testcase #1641.052 ms5 MB + 292 KBAcceptedScore: 0

Subtask #1 Testcase #1741.296 ms5 MB + 488 KBAcceptedScore: 0

Subtask #1 Testcase #1841.158 ms5 MB + 432 KBAcceptedScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-03-17 11:59:28 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠