AcWing 139 回文子串的最大長度

2022-06-10 16:33:15 字數 1275 閱讀 4701

原題鏈結

考察:字串hash+二分

這道題和前面的查詢子串的題一樣用到二分,答案都具有單調性,但這道題的單調性不是上道題那麼明顯.本道題不是簡單地列舉端點,如果列舉端點當然沒有單調性,本道題是用中心擴充套件思想(不是第一次學,但我完全不記得).選取乙個端點為中心,擴散到兩邊看是否為回文串.因為這道題是hash練習題所以用hash做,

中心擴充套件回文本來要分是偶數串還是奇數串,但我們可以通過一些小技巧全部化為奇數串:即在字元間插入其他字元

但是這樣在二分判斷的時候,返回的長度不一定是答案的長度,比如a#a,這個字串是回文的,但實際長度只有2.又比如d#a#b#a#c,這個字串的子字串也回文,但是實際長度是3.因此當加入新的操作的時候,要考慮此操作對其他操作的影響,這個在uva鍊錶的例題也是有體現的

思路:將字元#插入,求正向和逆向的hash,列舉中心點二分答案

1 #include 2 #include 3

using

namespace

std;

4const

int n = 2000010;5

const

int p = 133

;6 typedef unsigned long

long

ull;

7ull h[n],p[n],rh[n];

8char s[n>>1

],a[n];

9int

len,ans,kcase;

10int get(int l,int r,int

id)11

15bool check(int mid,int

i)16

20int

main()

2130 a[2*len] = '\0'

;31 len = 2*len-1;32

for(int i=1;i<=len;i++)

36for(int i=len;i>0;i--)

3740

for(int i=1;i<=len;i++)

48if(a[i-low]!='

#') ans = max(ans,low+1);//

因為加入了#,所以答案不是簡單的low

49else ans =max(ans,low);50}

51 printf("

case %d: %d\n

",++kcase,ans);52}

53return0;

54 }

34 回文子串

總時間限制 1000ms 記憶體限制 65536kb 描述 給定乙個字串,輸出所有長度至少為2的回文子串。回文子串即從左往右輸出和從右往左輸出結果是一樣的字串,比如 abba,cccdeedccc都是回文字串。輸入乙個字串,由字母或數字組成。長度500以內。輸出輸出所有的回文子串,每個子串一行。子串...

34 回文子串

34 回文子串 檢視 提交 統計 提問 總時間限制 1000ms 記憶體限制 65536kb 描述給定乙個字串,輸出所有長度至少為2的回文子串。回文子串即從左往右輸出和從右往左輸出結果是一樣的字串,比如 abba,cccdeedccc都是回文字串。輸入乙個字串,由字母或數字組成。長度500以內。輸出...

647 回文子串

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa 輸出 6 說明 6個回文子串 a a a aa aa aaa 分析 關鍵...