O(n)求最长回文子串的manacher算法

其他地方详解一大堆我就不多说了,来意识流地说一下具体步骤好了:

首尾各插一个不相关的不同的字符,然后原串每个字符之间和首尾都插一个字符一般都会用'#',这样据说是不用分开判断奇偶.

然后从左到右扫一遍,维护一个数组len[i]是s[i]到最长回文最右端字符的距离,那么len[i]-1就是原回文串的长度.

那么怎么维护呢?也不细说了,就贴个核心语句吧if (po > i)len[i] = min(po - i+1, len[2 * p - i]); else len[i] = 1;

至于为什么是O(n)我一开始也不太理解,但是慢慢感受一下还是能接受的...

最后就是蛋疼的while(cin>>s)好像不能停下来,所以读字符串还是用while(~scanf("%s",s))吧.



你可能感兴趣的:(O(n)求最长回文子串的manacher算法)