标签:
Manacher算法是求回文串最高效的算法,能在线性时间内求出以每一个字符为中心的最长回文串。
namespace solution{ void manacher(){ if(!((s[0]>=‘a‘&&s[0]<=‘z‘)||(s[0]>=‘A‘&&s[0]<=‘Z‘)))exit(0); LEN=strlen(s); t[0]=‘!‘; up(i,1,LEN*2){ t[i]=‘#‘; t[i+1]=s[i/2]; i++; } t[2*LEN+1]=‘#‘; t[2*LEN+2]=‘$‘; LEN=2*LEN+1; rightt=ans=pos=0; up(i,1,LEN){ if(rightt>i)len[i]=min(rightt-i,len[2*pos-i]); else len[i]=1; while(t[i-len[i]]==t[i+len[i]])len[i]++; if(len[i]+i>pos){ rightt=len[i]+i; pos=i; } ans=max(ans,len[i]); } printf("%d\n",ans-1); } }
首先把字符串转变,同时在最后一个字符处加上不同于所有字符的字符,防止越界。然后下面就是manacher算法的流程。不再多说。
标签:
原文地址:http://www.cnblogs.com/Cydiater/p/5792718.html