1. 程式人生 > >hdu3608 manacher模板題

hdu3608 manacher模板題

double fix urn 組成 put eps nac include -i

給出一個只由小寫英文字符a,b,c...y,z組成的字符串S,求S中最長回文串的長度.
回文就是正反讀都是一樣的字符串,如aba, abba等

Input輸入有多組case,不超過120組,每組輸入為一行小寫英文字符a,b,c...y,z組成的字符串S
兩組case之間由空行隔開(該空行不用處理)
字符串長度len <= 110000Output每一行一個整數x,對應一組case,表示該組case的字符串中所包含的最長回文長度.
Sample Input

aaaa

abab

Sample Output

4
3
題意:找最長回文子串
題解:manacher算法,據說這是一道連後綴數組O(nlogn)也卡的神題。。結果真的是,第一次用manacher寫也tle了,估計是寫搓了改了好幾遍
技術分享
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define
ll long long #define mod 10007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-9; const int N=2000000+5,maxn=(1<<18)-1,inf=0x3f3f3f3f; string str; int p[N],slen; void manacher() { int mx=0,id; for(int i=1;i<=slen;i++) { if
(mx>i)p[i]=min(p[2*id-i],mx-i); else p[i]=1; while(str[i+p[i]]==str[i-p[i]])p[i]++; if(p[i]+i>mx) { mx=p[i]+i; id=i; } } } int main() { ios::sync_with_stdio(false); cin.tie(0); // cout<<setiosflags(ios::fixed)<<setprecision(2); string s; int cnt=0; while(cin>>s){ str="$#"; for(int i=0;i<s.size();i++) { str+=s[i]; str+="#"; } slen=str.size(); memset(p,0,sizeof p); manacher(); int ans=-1; for(int i=1;i<str.size();i++) ans=max(ans,p[i]-1); cout<<ans<<endl; } return 0; }
View Code

hdu3608 manacher模板題