hdu3068 . 最长回文
生活随笔
收集整理的這篇文章主要介紹了
hdu3068 . 最长回文
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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
aaaa
abab
Sample Output
4
3
Source
2009 Multi-University Training Contest 16 - Host by NIT
Solution
這題是求最長回文子串的裸題!
由于數據規模和題目限制,這題只能用時間空間復雜度都是 O(N) 的
——
Manacher算法Manacher 算法 具體請參見我的博客:http://blog.csdn.net/liyizhixl/article/details/54347434
這樣直接套用,就可以卡常過這題啦!
Code
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=110002*2; char s[N*2]; int p[N*2]; int ans,id; int main() {while(scanf("%s",s)!=EOF){int len=strlen(s);for(int i=len;i>=0;i--){int k=i*2+1;s[k+1]=s[i],s[k]='#';}len*=2;s[ans=id=0]='*';for(int i=2;i<=len;i++){if(p[id]+id>i) p[i]=min(p[id*2-i],p[id]+id-i); else p[i]=1;while(s[i-p[i]]==s[i+p[i]]) p[i]++;if(p[i]+i>p[id]+id) id=i;if(p[i]>ans) ans=p[i];}printf("%d\n",ans-1);}return 0; }總結
以上是生活随笔為你收集整理的hdu3068 . 最长回文的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 3804. 【NOIP2014
- 下一篇: Manacher 算法模板