回文子串的最大長度

2021-09-14 02:23:00 字數 2762 閱讀 8667

回文子串的最大長度

如果乙個字串正著讀和倒著讀是一樣的,則稱它是回文的。

給定乙個長度為n的字串s,求他的最長回文子串的長度是多少。

輸入格式

輸入將包含最多30個測試用例,每個測試用例佔一行,以最多1000000個小寫字元的形式給出。

輸入以乙個以字串「end」(不包括引號)開頭的行表示輸入終止。

輸出格式

對於輸入中的每個測試用例,輸出測試用例編號和最大回文子串的長度(參考樣例格式)。

每個輸出佔一行。

輸入樣例:

abcbabcbabcba

abacacbaaaab

end

輸出樣例:

case 1: 13

case 2: 6

思路:

先分別從頭至尾,從尾到頭雜湊一次

列舉回文串中心和長度,將回文串分成前後兩半,再判斷兩半是否構成回文

倒著的雜湊:

對於乙個長度為l的字串a(下標從1開始)

hash[a] = a[1]*pl-1 + a[2]*pl-2 + … + a[l]*p0

tle乙個個加長度的…

#include 

#include

using namespace std;

#define n

1000005

unsigned long long p

=131

;unsigned long long hash1[n]

,hash2[n]

,p[n];

unsigned long long cal1

(int l,int r)

unsigned long long cal2

(int l,int r)

int main()

string s;

int t=

0,ans;

while

(cin>>s && s!=

"end"

) hash2[m+1]

=0;for

(int i=m;i>0;

--i)

for(int i=

1;i<=m;

++i)

//列舉以s[i]為中心的 長度為奇數的回文串

p--; ans=

max(ans,

2*p+1)

;}for(int i=

1;i++i)

//列舉以s[i]和s[i+1]之間的縫隙為中心的 長度為偶數的回文串

p--; ans=

max(ans,

2*p);}

t++;printf

("case %d: %d\n"

,t,ans);}

return0;

}

ac

二分列舉長度,很多細節要注意(wa了n次…)

#include 

#include

using namespace std;

#define n

1000005

unsigned long long p

=131

;unsigned long long hash1[n]

,hash2[n]

,p[n];

unsigned long long cal1

(int l,int r)

unsigned long long cal2

(int l,int r)

int main()

string s;

int t=

0,ans;

while

(cin>>s && s!=

"end"

) hash2[m+1]

=0;for

(int i=m;i>0;

--i)

for(int i=

2;i++i)

//列舉以s[i-1]為中心的 長度為奇數的回文串

//printf("#1 %d %d %d %d\n",i,l,r,p);if(

!(i-p>

0&& i+p<=m &&

cal1

(i-p,i-1)

==cal2

(i+1

,i+p)))

//可能一次迴圈中p不滿足條件但l>=r跳出了

p--; ans=

max(ans,p<<1|

1);}

for(int i=

1;i++i)

//列舉以s[i-1]和s[i]之間的縫隙為中心的 長度為偶數的回文串

//printf("#2 %d %d %d %d\n",i,l,r,p);if(

!(i-p+

1>

0&& i+p<=m &&

cal1

(i-p+

1,i)

==cal2

(i+1

,i+p)))

p--; ans=

max(ans,l<<1)

;}t++

;printf

("case %d: %d\n"

,t,ans);}

return0;

}

最大回文子串行 最大回文子串

最大回文子串行,例如cafgfkc,最大回文子串行cfgfc,輸出5。子串行相當於刪除某些位置上的字元後形成的序列。最大回文子串,例如cafgfkc,最大回文子串fgf,輸出3。子串相當於擷取start位到end位的子串。試過沒認真看題目,原題是求子序列,想當然以為求子串,直接高高興興用manach...

最大回文子串

輸入乙個字串,求出其中最大回文子串的長度。子串的含義是 在原串中連續出現的字串片段。回文的含義是 正著看和倒著看相同,如abba和yyxyy。在判斷時,應該忽略所有標點符號和空格,且忽略大小寫,但輸出應保持原樣 在回文串的首部和尾部不要輸出多餘字元 include string include io...

回文子串的最大長度 雜湊,二分

題目鏈結 如果乙個字串正著讀和倒著讀是一樣的,則稱它是回文的。給定乙個長度為 n 的字串 s,求他的最長回文子串的長度是多少。輸入將包含最多 30 個測試用例,每個測試用例佔一行,以最多 1000000 個小寫字元的形式給出。輸入以乙個以字串 end 開頭的行表示輸入終止。對於輸入中的每個測試用例,...