[问题] Manacher 算法 求最长回文字串

楼主: DiLegend (JOU)   2015-05-05 21:32:23
这几天都再研究这个算法
算法本身好像懂又好像不懂
实际测试后
忽然注意到一点
void pk()
{
int i;
int mx = 0;
int id;
for(i=1; i<n; i++)
{
if( mx > i )
p[i] = MIN( p[2*id-i], mx-i );
else
p[i] = 1;
for(; str[i+p[i]] == str[i-p[i]]; p[i]++)
;
if( p[i] + i > mx )
{
mx = p[i] + i;
id = i;
}
}
}
for(; str[i+p[i]] == str[i-p[i]]; p[i]++)
;
我不懂这句为什么不会造成内存问题
实际debug看 跑到可能会错误时 到这句就直接跳过
作者: scwg ( )   2015-05-05 21:43:00
运气好 str[-1] 可以读? 算法 MIN 取左边时要跳过那个for
作者: yvb   2015-05-05 21:56:00
google 了一下, 那个 str 跟输入内容不同, 已经被转换过了.比方输入为 "abcd", 则 str 为 "$#a#b#c#d#"
楼主: DiLegend (JOU)   2015-05-05 22:11:00
对会转成那样 我这几天再想 aaaaa 转成$#a#a#a#a#a#算到第4个a时 为何不会str[i+p[i]] str[8+4] 然后爆了
作者: yvb   2015-05-05 22:28:00
??? str[8+4] => '\0', str[8-4] => 'a', for 就跳出了...
楼主: DiLegend (JOU)   2015-05-06 09:47:00
str=[$#a#a#a#a#a#] str[0~11] str[12]不就超出了哪来的 '\0' 啊
作者: scwg ( )   2015-05-06 10:02:00
C 的字串一律用 '\0' 字符标记结束. 写 "abc" 实际上有四个字符: 'a' 'b' 'c' '\0'
作者: yvb   2015-05-06 21:08:00
这实作还是小有问题. 若输入为 "$", 会发生 str[-1] 的情况.
作者: scwg ( )   2015-05-07 00:29:00
题目在 http://poj.org/problem?id=3974 只有小写字母
作者: yvb   2015-05-07 14:13:00
说得也是. 按其说明, '$'和'#' 实际上是选取不会出现的字符.

Links booklink

Contact Us: admin [ a t ] ucptt.com