最长回文字串(马拉车算法)

很简单的例题,就比如hdu3068那个,模版题。
首先我们可以考虑暴力,然后可以枚举中心,当你枚举中心的时候,先是1,再是2,如果2不行,那就可以退出了,因为以该点为中心的字符串不能继续拓展了。我们应该开始枚举下一个中心点了。
然后我们考虑优化,马拉车算法的核心就是利用了前面计算的信息,从而高效的得出最长回文字串,考虑奇偶性的时候,我们插入‘#’使得统一。

/**************************
 *Create time: Fri Jul 29 21:15:44 2016

 *Author: Mymilkbottles

 *File name: HihoCoder1032
**************************/
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define pi(x,y) printf("%d%c",(x),(y));
#define pin(x) printf("%d\n",(x));
#define si(x) scanf("%d",&(x))
#define sii(x,y) scanf("%d%d",&(x),&(y))
#define s3(x,y,z) scanf("%d%d%d",&(x),&(y),&(z))
#define rep(x,y,z) for(int (x)=(y);(x)<(z);++(x))
#define dep(x,y,z) for(int (x)=(y)-1;(x)>=(z);--(x))
#define read int TcaseN;scanf("%d",&TcaseN);for(int Tcase=1;Tcase<=TcaseN;++Tcase)
#define cls(x,y) memset((x),(y),sizeof((x)));
#define pb(x) push_back(x)
#define mp(x,y) make_pair((x),(y))
#define max3(value_a,value_b,value_c) max(max(value_a,value_b),value_c)
#define min3(value_a,value_b,value_c) min(min(value_a,value_b),value_c)
#define GT(x) (x)=clock();

///In This You Can Define Long Integer Type
#define LONGTYPE long long
typedef LONGTYPE LL;
typedef unsigned LONGTYPE ULL;
const int maxint=((~((unsigned)(0)))>>1);
const LL maxll=((~((unsigned LONGTYPE)(0)))>>1);

const int inf=0x3f3f3f3f;
const double PI=acos(-1.0);
const int maxn=1e6+1000+5;

char dp[maxn<<1];
char a[maxn];
int p[maxn<<1];
int len;

void MLC() {
    int mx=0,id=1,ans=0;
    p[0]=0;
    rep(i,1,len) {
        if(mx>i) {
            p[i]=min(p[(id<<1)-i],mx-i);
        } else p[i]=1;
        while(dp[i-p[i]]==dp[p[i]+i])++p[i];
//        cout<<"i="<if(p[i]+i>mx) {
            mx=p[i]+i;
            id=i;
        }
        ans=max(ans,p[i]-1);
    }
    printf("%d\n",ans);
}
int main() {
#ifdef tangge
    clock_t tSTART,tEND,t3;
    GT(tSTART);
#endif // tangge

    int n;
//    si(n);
    while(~scanf("%s",a)) {
        getchar();
        int lens=strlen(a);
        len=1;
        dp[0]='$';
        dp[len++]='#';
        rep(i,0,lens) {
            dp[len++]=a[i];
            dp[len++]='#';
        }
        dp[len++]='\0';
        MLC();
    }
#ifdef tangge
    GT(tEND);
    printf("%.8lf\n",(tEND-tSTART)/1000.0);
#endif // tangge
    return 0;
}

你可能感兴趣的:(黑科技的学习)