从0开始的后缀数组为什么要在最后加$

P3809 【模板】后缀排序

`for(int w = 1, p = 0; p + 1 < n; m = p + 1, w <<= 1)` => `for(int w = 1, p = 0; p + 1 < n&&w<n; m = p + 1, w <<= 1) {`
by yukimianyan @ 2022-08-12 17:11:43


试一下?
by yukimianyan @ 2022-08-12 17:12:07


@[yukimianyan](/user/509229) 试了一下还是不行,像`aaaaaaaa` 这种排出来还是错的,`p + 1 < n` 应该是控制 sa 互不相同的,排序完成就会退出,所以加 `w < n` 好像没有影响
by WorldBest丶牛顿 @ 2022-08-13 11:52:48


@[WorldBest丶牛顿](/user/53164) 你手动模拟一下就知道了
by yu1102 @ 2023-01-10 11:18:42


@[WorldBest丶牛顿](/user/53164) rnk[sa[0]] = p = 0; 应改成rnk[sa[0]] = p = 1;(程序其他地方相应修改) tax下标的范围应是1~m而不是0~m-1,否则会和数组后面的0产生混淆。
by yu1102 @ 2023-01-10 11:24:57


@[鲨鱼小王子](/user/409860) 疑问,不是很能理解您的意思。 ``` (tp[sa[i - 1]] == tp[sa[i]] && tp[sa[i - 1] + w] == tp[sa[i] + w]) ``` 应该是这句话的问题吧,不加分隔符可能会越界? @[WorldBest丶牛顿](/user/53164) 如果楼主还在的话?
by DitaMirika @ 2023-01-29 14:39:44


@[SweetOrangeOvO](/user/236862) 对啊,我就是这个意思。可能我的表述不是很清楚
by yu1102 @ 2023-01-29 15:28:50


@[鲨鱼小王子](/user/409860) 那 rnk 和 tax 的范围都没问题啊,只是需要把字符串最后的分隔符带上做排序就行了吧?
by DitaMirika @ 2023-01-29 15:33:24


@[SweetOrangeOvO](/user/236862) 搞明白了。 按楼主的代码,不加分隔符$,会导致: 所有数组初始化为0,相当于以0作为分隔符 --> “tp[sa[i - 1] + w]” **越界** ,导致rnk计算错误,(而不是RE,因为目前规模还很小) --> 因为rnk计算错误,所以不停循环 --> 因为不停循环,所以w变得很大很大 --> “tp[sa[i - 1] + w]” **越界**,超出数组范围 --> 段错误
by yu1102 @ 2023-01-29 16:38:03


挖个坟,自己也遇到了这种问题 一个简单的解决方法是手动检测:若sa[i-1]+w和sa[i]+w里面一个小于n一个大于等于n那么就++p 感谢楼上两位
by LoveMe_ @ 2023-05-23 21:59:15


|