原題鏈結
考察:字串hash+二分
這道題和前面的查詢子串的題一樣用到二分,答案都具有單調性,但這道題的單調性不是上道題那麼明顯.本道題不是簡單地列舉端點,如果列舉端點當然沒有單調性,本道題是用中心擴充套件思想(不是第一次學,但我完全不記得).選取乙個端點為中心,擴散到兩邊看是否為回文串.因為這道題是hash練習題所以用hash做,
中心擴充套件回文本來要分是偶數串還是奇數串,但我們可以通過一些小技巧全部化為奇數串:即在字元間插入其他字元
但是這樣在二分判斷的時候,返回的長度不一定是答案的長度,比如a#a,這個字串是回文的,但實際長度只有2.又比如d#a#b#a#c,這個字串的子字串也回文,但是實際長度是3.因此當加入新的操作的時候,要考慮此操作對其他操作的影響,這個在uva鍊錶的例題也是有體現的
思路:將字元#插入,求正向和逆向的hash,列舉中心點二分答案
1 #include 2 #include 3using
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 分析 關鍵...