hdu3608 manacher模板題
阿新 • • 發佈:2017-05-10
double fix urn 組成 put eps nac include -i 給出一個只由小寫英文字符a,b,c...y,z組成的字符串S,求S中最長回文串的長度.
回文就是正反讀都是一樣的字符串,如aba, abba等
回文就是正反讀都是一樣的字符串,如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) #defineView Codell 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; }
hdu3608 manacher模板題