马拉车模板
Posted Roni
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了马拉车模板相关的知识,希望对你有一定的参考价值。
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; }
#include <cstdio> #include <iostream> #include <cstring> using namespace std; const int maxn = 100100; char str[maxn]; char temp[maxn*2]; int l[maxn*2]; void malache(char *str) { int len = strlen(str); temp[0]=‘¥‘; temp[1]=‘#‘; for(int i = 0; i < len ; i++) { temp[(i+1)*2] = str[i]; temp[(i+1)*2+1] = ‘#‘; } int mx = 0, po = 0,ans = 0; for(int i = 0;i <= 2*len+1; i++) { if(i < mx) l[i] = min(l[2*po-i],mx-i); else l[i] = 1; while(temp[i-l[i]] == temp[i+l[i]]) l[i]++; if(l[i]+i > mx) {po = i; mx = l[i]+i;} ans = max(ans , l[i]); } cout << ans - 1 <<endl; } int main() { memset(temp,0,sizeof(temp)); cin >> str; malache(str); return 0; }
以上是关于马拉车模板的主要内容,如果未能解决你的问题,请参考以下文章