其他地方详解一大堆我就不多说了,来意识流地说一下具体步骤好了:
首尾各插一个不相关的不同的字符,然后原串每个字符之间和首尾都插一个字符一般都会用'#',这样据说是不用分开判断奇偶.
然后从左到右扫一遍,维护一个数组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))吧.