题解求助

P10995 【MX-J3-T2】Substring

1. 因为 $c_i$ 本质上是一个前缀和数组,用于记录以 $x$ 开头的子串的个数与这个是相同的! ```cpp for (int i=1;i<=n;i++){ c[i]=n-p[i]+1; } for (int i=1;i<=n;i++){ c[i]+=c[i-1]; } ``` 2. 首先我们可以通过前缀和数组得到k所处在的区间,而这个区间就是 $c[l-1]+1$ 到 $c[l]$ 之间,由此可知所求子串的左端点的值是 $l$ ,通过数组 $p$ 可知左端点下标为 $p[i]$ 。 对于区间长度来说,可以感性理解为“对于上个值来说超出去的那段长度”,配合下图来看就可以得到 $ k-c[l-1] $ 。 3. 这点的话就是一个常用定理了: $ r=l+len-1 $ 。 在这道题中得到了 $l$ 和 $len$ ,也就可以直接套这个公式解决了。 4. 如果还有什么疑问可以看一下下面这张图,多理解一下这道题前缀和的写法,画画图,多手磨几个样例应该就可以理解了。(第一次做这个的时候也给我绕了半天……) ![可参考本图](https://cdn.luogu.com.cn/upload/image_hosting/lhdnhwcq.png)
by Hebe_Gu @ 2024-08-31 01:54:18


@[Hebe_Gu](/user/685248) 哦~,原来是这样呀,懂了懂了,谢谢你
by xingshuyan000 @ 2024-08-31 11:12:41


|