日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu3068 . 最长回文

發(fā)布時間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu3068 . 最长回文 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Problem Description

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

Input

輸入有多組 case ,不超過 120 組,每組輸入為一行小寫英文字符 a,b,c...y,z 組成的字符串 S
兩組 case 之間由空行隔開 (該空行不用處理)
字符串長度 len<=110000

Output

每一行一個整數(shù)x,對應(yīng)一組case,表示該組case的字符串中所包含的最長回文長度.

Sample Input

aaaa

abab

Sample Output

4
3

Source

2009 Multi-University Training Contest 16 - Host by NIT

Solution

  • 這題是求最長回文子串的裸題!

  • 由于數(shù)據(jù)規(guī)模和題目限制,這題只能用時間空間復(fù)雜度都是 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; }

總結(jié)

以上是生活随笔為你收集整理的hdu3068 . 最长回文的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。