码迷,mamicode.com
首页 > 其他好文 > 详细

最长回文 HDU - 3068 (Mannacher模板题)

时间:2020-02-08 00:45:03      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:模板   stream   include   nbsp   oid   while   ++   mem   ems   

#include<iostream>
#include<algorithm>
#include<cstring>
 using namespace std;
 const int maxn=110010;
 char t[maxn],s[maxn*3];
 int p[maxn*3],lens;
 void init()
 {
     memset(s,\0,sizeof(s));
     int len=strlen(t);
     lens=0;
     s[lens++]=+;
     for(int i=0;i<len;i++)    s[lens++]=#,s[lens++]=t[i];
     s[lens]=#;
 }
 int Manacher()
 {
     int Maxlen=1,id=0,mx=0;
     memset(p,0,sizeof(p));
    for ( int i=1; i<lens; i++ ){
        p[i]= mx>i ? min( p[2*id-i],mx-i) : 1;
        while( s[i-p[i]] == s[i+p[i]] ) p[i]++;
        if( mx < i+p[i] ) mx=i+p[i], id=i;
        Maxlen=max( Maxlen,p[i]-1);
    }
    return Maxlen;
 }
 int main()
 {
     while(~scanf("%s",t)){
         init();
         printf("%d\n",Manacher());
     }
     return 0;
 }

 

最长回文 HDU - 3068 (Mannacher模板题)

标签:模板   stream   include   nbsp   oid   while   ++   mem   ems   

原文地址:https://www.cnblogs.com/overrate-wsj/p/12275094.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!