題目鏈結
如果乙個字串正著讀和倒著讀是一樣的,則稱它是回文的。
給定乙個長度為 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 ...