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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P3805 【模版】manacher算法(manacher)

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

P3805 【模版】manacher算法

題目描述

給出一個只由小寫英文字符a,b,c...y,z組成的字符串S,求S中最長回文串的長度.

字符串長度為n

輸入輸出格式

輸入格式:

?

一行小寫英文字符a,b,c...y,z組成的字符串S

?

輸出格式:

?

一個整數(shù)表示答案

?

輸入輸出樣例

輸入樣例#1:
aaa 輸出樣例#1:
3

說明

字符串長度len <= 11000000

分析

str數(shù)組是原來的數(shù)組,s是后來的數(shù)組。

那樣例說,str:aaa,s:##a#a#a#,轉(zhuǎn)變的過程中的左移等位運算模擬一下就會很清楚。

原先是一個一個賦值,s[k++] = '#',?str[k++] = s[i];結(jié)果tle最后一個點,改成位運算好了。?

manacher模板

code

1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define MAXN 31000000 5 using namespace std; 6 7 char s[MAXN],str[MAXN]; 8 int p[MAXN],len; 9 10 void init() 11 { 12 len = strlen(str); 13 s[0] = '#'; 14 for (int i=0; i<len; ++i) 15 { 16 s[i<<1|1] = '#'; 17 s[(i+1)<<1] = str[i]; 18 } 19 s[len<<1|1] = '#'; 20 len = (len<<1|1); 21 } 22 int manacher() 23 { 24 int mx = 0, id; 25 for (int i=1; i<=len; ++i) 26 { 27 if (mx>i) p[i] = min(p[id<<1-1],mx-i); 28 else p[i] = 1; 29 while (s[i+p[i]]==s[i-p[i]]) p[i]++; 30 if (p[i]+i>mx) 31 mx = p[i]+i, id = i; 32 } 33 int ans = 0; 34 for (int i=1; i<len; ++i) ans = max(ans,p[i]); 35 return ans-1; 36 } 37 int main() 38 { 39 scanf("%s",str); 40 init(); 41 printf("%d",manacher()); 42 return 0; 43 }

轉(zhuǎn)載于:https://www.cnblogs.com/mjtcn/p/7159279.html

總結(jié)

以上是生活随笔為你收集整理的P3805 【模版】manacher算法(manacher)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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