HDU3068 最长回文 manacher模板

来源:互联网 发布:大数据基金有哪些 编辑:程序博客网 时间:2024/05/22 09:09

题目链接:HDU3068

最长回文

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15211    Accepted Submission(s): 5573


Problem Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
 

Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
 

Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
 

Sample Input
aaaaabab
 

Sample Output
43
 
题目分析:裸的manacher模板
////  main.cpp//  HDU3068(1////  Created by teddywang on 16/6/7.//  Copyright © 2016年 teddywang. All rights reserved.//#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;char s[111111<<1];int p[111111<<1];int main(){    while(~scanf("%s",s))    {        int len=strlen(s);        for(int i=len;i>=0;i--)        {            s[2*i+2]=s[i];            s[2*i+1]='#';        }        s[0]='*';        int id=0,maxn=0,maxlen=0;        for(int i=2;i<2*len+1;i++)        {            maxlen=p[id]+id-1;            if(maxlen>i-1) p[i]=min(p[2*id-i],maxlen-i+1);            else p[i]=1;            while(s[i+p[i]]==s[i-p[i]]) p[i]++;            if(p[i]>maxn) maxn=p[i];            if(i+p[i]>p[id]+id) id=i;        }        cout<<maxn-1<<endl;    }}



0 0
原创粉丝点击