回文子串的最大長度
如果乙個字串正著讀和倒著讀是一樣的,則稱它是回文的。
給定乙個長度為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 開頭的行表示輸入終止。對於輸入中的每個測試用例,...