`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