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

2021-10-22 09:26:53 字數 1240 閱讀 8217

題目鏈結

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

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

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

輸入以乙個以字串 end 開頭的行表示輸入終止。

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

每個輸出佔一行。

abcbabcbabcba

abacacbaaaab

endcase 1: 13

case 2: 6

子串為 字串連續的一段,判斷回文我們採用雜湊的方式判斷,選取子串的情況我們用,列舉中間點(用馬拉車方法將字串變為奇數個) 之後二分操作的半徑,找到最大的滿足半徑,之後判斷馬拉車後的字元個數.

#include

#include

#include

#include

using namespace std;

const

int maxn=

2000010

,p=131

;typedef

unsigned

long

long ull;

ull hl[maxn]

,hr[maxn]

,p[maxn]

;char str[maxn]

;ull get

(ull h,

int l,

int r )

intmain()

len*=2

; p[0]

=1;for

(int i=

1,j=len;i<=len;i++

,j--

)int res=0;

for(

int i=

1;i<=len;i++

)//選取中間點

if(str[i+l]

<=

'z')

//兩端由字元包圍說明字元多乙個

res=

max(res,l+1)

;else

//兩端由非字母包圍說明非字元多乙個

res=

max(res,l);}

printf

("case %d: %d\n"

,t++

,res);}

}

回文子串的最大長度

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

字元雜湊 二分答案求最長回文串

給乙個字串,求出其中是回文串的子串的最大長度 例如 aaaaaa 6baaaaac 5遍歷每個字元,以他為中心,向兩邊遍歷,時間複雜度o n2 可以看到是非常慢的 就比如取個質數p 131 字串 aabbcc 他的雜湊值為 a a 1 p 5 a a 1 p 4 b a 1 p 3 b a 1 p ...

子串查詢 二分

給出乙個長度為n的字串s和q個查詢。對於每乙個查詢,會輸入乙個字串t,你需要判斷這個字串t是不是s的子串。子串的定義就是存在任意下標a第二行乙個長度為n的字串s,所有字元都為小寫拉丁字元。接下來q行每行乙個字串t。1 t 50。輸出描述 對於每個查詢,如果t是s的字串,輸出 yes 否則輸出 no ...