后缀排序炸了

https://www.luogu.com.cn/problem/P3809

#include <bits/stdc++.h>

using namespace std;

int sa[1000005], sb[1000005];
char str[1000005];
int a[1000005];
int n;

int get(int l, int r) {
	return sb[r] - sb[l - 1] * sa[r - l + 1];
}

bool cmp(int l1, int l2) {
	int l = -1, r = min(n - l1, n - l2);
	while (l < r) {
		int mid = (l + r + 1) >> 1;
		if (get(l1, l1 + mid) == get(l2, l2 + mid)) l = mid;
		else r = mid - 1;
	}
	if (l > min(n - l1, n - l2)) return l1 > l2;
	else return str[l1 + l + 1] < str[l2 + l + 1];
}

int main(void)
{
	cin >> (str + 1);
	n = strlen(str + 1);
	
	sa[0] = 1;
	
	for (int i = 1; i <= n; i++) {
		sa[i] = sa[i - 1] - 'a';
		sb[i] = sb[i - 1] - 'a' + str[i];
		a[i] = i;
	}
	
	sort(a + 1, a + n + 1, cmp);
	
	for (int i = 1; i <= n; i++) {
		cout << a[i] << ' ';	
	}
	
	return 0;
}

输出不对吧,人家让你输出下标

1 个赞

不是你这么打的,建议在去看看后缀数组简介 - OI Wiki
或者你去买本算法竞赛,我是那本书上学的

1 个赞

输出的是下标

我悟了!

不能 - ‘a’,随便乘一个数就行了,改成这样过样例了:

		sa[i] = sa[i - 1] * 1;
		sb[i] = sb[i - 1] * 1 + str[i];

然后10分

1 个赞

很好,WA+TLE+一个点AC。。。

哦~ 乘以122就全过了,剩下的TLE,开始卡常

你这个不好卡我30ms都卡半天。
你这个至少超了1S,很难卡,而且你这应该是哈希吧

1 个赞

你把二分那段展开,不就直接减少31倍

1 个赞

卡完全RE……笑死了

把sort改成stable_sort过了!