manacher求最长回文子串算法模板
#include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <string> #include <math.h> #include <stdlib.h> using namespace std; #define maxn 110100 int p[2*maxn]; char s[2*maxn]; void manacher(char *s){ int n=strlen(s); for(int i=n;i>=0;i--){ s[2*i+2]=s[i]; s[2*i+1]='#'; } s[0]='*'; int mx=0; int id; int ans=0; for(int i=1;i<2*n+2;i++){ if(mx>i) p[i]=min(p[2*id-i],mx-i); else p[i] = 1; for(;s[i+p[i]]==s[i-p[i]];p[i]++) ; if(p[i]+i>mx){ mx=p[i]+i; id=i; } ans=max(p[i],ans); } printf("%d\n",ans-1); } int main() { while(scanf("%s",s)!=EOF){ manacher(s); } return 0; }
原文地址:http://www.cnblogs.com/pk28/
与有肝胆人共事,从无字句处读书。
欢迎关注公众号:
欢迎关注公众号: