网上说求回文串有三种算法,lcs的n^2算法,后缀数组n*log(n),manacher的时间复杂度是O(n)的。
我以前只会n^2的算法,刚学的这个算法。
void manacher(){ int id,mx=0,len; len=strlen(cstr); for(int i=1;i<len;i++){ if(mx>i) p[i]=min(p[id*2-i],mx-i); else p[i]=1; for(;cstr[i+p[i]]==cstr[i-p[i]];p[i]++); ans=max(ans,p[i]); if(mx<p[i]+i) mx=p[i]+i,id=i; } }
代码的实现上很简单,也很好写。