关于马拉车复杂度的证明。。

P3805 【模板】manacher

@[鏡音リン](/space/show?uid=28913) 你暴力拓展的时候不也是每拓展一**下**右边界就增加一次?所以右边界增加 $O(n)$ 次啊。除了暴力拓展的其他情况都是 $O(1)$ 的,复杂度显然 $O(n)$ 啊……这个复杂度的计算我觉得和MP差不很多?
by 一扶苏一 @ 2018-12-16 09:35:14


@[一扶苏一](/space/show?uid=65363) 不是拓展右边界啊,我指的是 ↓某字符串中的左右边界 |-------------**mid**-------**i**-----**maxright**| ↑这种$i$在$maxright$左边,虽然知道有$r[i]>=min(r[mid*2-i],maxright-i)$但毕竟还要再往两边继续拓展一下啊 ```cpp while(s[i+r[i]]==s[i-r[i]])++r[i]; ``` 也就是还要跑上面这个,这就不是$O(1)$了吧
by Utsuji_risshū @ 2018-12-16 09:57:38


@[鏡音リン](/space/show?uid=28913) ~~说实话我没看懂您的r[i]是啥~~ 如果您 $r_i$ 指的是回文半径的话,您执行完这一句难道不应该再加一句 ``maxright = std::max(maxright, r[i])``嘛…… 这样右端点的移动还是 $O(n)$ 的哇
by 一扶苏一 @ 2018-12-16 10:06:50


啊 那里``r[i]``应该改成``r[i] + i`` 如果您左闭右开可能还要-1?我懒得算了不过差不多就这个意思qwq
by 一扶苏一 @ 2018-12-16 10:08:13


@[一扶苏一](/space/show?uid=65363) $maxright = std::max(maxright, r[i])$这个不一定右端点就动了啊,可能我$r_i$确实算出来了,但加上$i$也没比$maxright$大。
by Utsuji_risshū @ 2018-12-16 10:22:25


然后发现有人做实验说平均每个字符最坏要循环5次所以是$O(n)$,感觉这个很迷。。
by Utsuji_risshū @ 2018-12-16 10:23:51


@[鏡音リン](/space/show?uid=28913) 害怕……不会我马拉车写的是错的吧…… 我写的马拉车如果当前中心的回文右端点小于 $maxright$ 的话,显然对称位置的串的回文左端点大于当前 $maxright$ 关于 $mid$ 的对称点。这是个充要条件,反过来也成立,所以如果要判断当前的右端点是否小于 $maxright$ 的话直接 $O(1)$ 看对称点的左端点就好了啊……您说这种情况是 $O(1)$ 的啊……
by 一扶苏一 @ 2018-12-16 10:37:04


@[一扶苏一](/space/show?uid=65363) 突然明白为什么$O(1)$了。谢谢奆佬~
by Utsuji_risshū @ 2018-12-16 10:51:35


@[鏡音リン](/space/show?uid=28913) 没事qwq 我好弱的
by 一扶苏一 @ 2018-12-16 10:58:15


|