马拉车模板
Input
输入Str(Str的长度 <= 1000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5
【模板】
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char ch[100100]; char T[200200]; int P[200200]; int main() { scanf("%s",ch); int ll=strlen(ch); memset(T,0,sizeof(T)); T[0]=1; for (int i=0;i<=ll;i++) { T[2*i+1]='#'; T[2*i+2]=ch[i]; } ll=2*ll+2; int ss=0,ans=0,mid; for (int i=1;i<=ll;i++) { if (ss>i) P[i]=min(P[2*mid-i],ss-i+1); else P[i]=1; while (T[i+P[i]]==T[i-P[i]]) P[i]++; if (ss<P[i]+i-1) { mid=i; ss=P[i]+i-1; } ans=max(ans,P[i]-1); } printf("%d\n",ans); return 0; }
const int maxn=1000010; char str[maxn];//原字符串 char tmp[maxn<<1];//转换后的字符串 int Len[maxn<<1]; //转换原始串 int INIT(char *st) { int i,len=strlen(st); tmp[0]='@';//字符串开头增加一个特殊字符,防止越界 for(i=1;i<=2*len;i+=2) { tmp[i]='#'; tmp[i+1]=st[i/2]; } tmp[2*len+1]='#'; tmp[2*len+2]='$';//字符串结尾加一个字符,防止越界 tmp[2*len+3]=0; return 2*len+1;//返回转换字符串的长度 } //Manacher算法计算过程 int MANACHER(char *st,int len) { int mx=0,ans=0,po=0;//mx即为当前计算回文串最右边字符的最大值 for(int i=1;i<=len;i++) { if(mx>i) Len[i]=min(mx-i,Len[2*po-i]);//在Len[j]和mx-i中取个小 else Len[i]=1;//如果i>=mx,要从头开始匹配 while(st[i-Len[i]]==st[i+Len[i]]) Len[i]++; if(Len[i]+i>mx)//若新计算的回文串右端点位置大于mx,要更新po和mx的值 { mx=Len[i]+i; po=i; } ans=max(ans,Len[i]); } return ans-1;//返回Len[i]中的最大值-1即为原串的最长回文子串额长度 }