JSOI2016 扭動的回文串

2022-08-13 14:39:13 字數 1077 閱讀 7474

可以發現最後的答案一定長成\(a\)串和\(b\)串的一對對稱的子串(長度可以為\(0\))

然後中間夾著\(a\)串或者\(b\)串中的乙個回文串(長度可以為\(0\))

對於每乙個中心點,對應的最大的答案中間所夾的那個回文串一定是以這個中心點為對稱中心的最長回文串

那麼就從以這個中心點為對稱中心的最長回文串的兩邊開始找那個\(a\)串和\(b\)串的對稱部分

看看兩邊最長能擴充套件多長,二分+雜湊判斷即可

#include#include#include#include# define ull unsigned long long

const int m = 200010 ;

const ull base = 233 ;

using namespace std ;

char s1[m] , s2[m] , p[m] ;

ull pw[m] , hsh1[m] , hsh2[m] ;

int n , m , ans , r[m] , posi[m] ;

inline bool same(int l1 , int r1 , int l2 , int r2)

inline void update(int lpos , int rpos , int dlt)

ans = max(ans , rpos - lpos + 1 + ret * 2) ;

} else

ans = max(ans , rpos - lpos + 1 + ret * 2) ; }}

inline void manacher(char *s , int dlt)

p[++m] = '#' ; posi[m] = n + 1 ; p[++m] = '@' ;

int mx = 0 , pos = 0 ;

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

}int main()

JSOI2016 扭動的回文串

description jyy有兩個長度均為n的字串a和b。乙個 扭動字串s i,j,k 由a中的第i個字元到第j個字元組成的子串 與b中的第j個字元到第k個字元組成的子串拼接而成。比如,若a xyz b uvw 則扭動字串s 1,2,3 xyvw jyy定義乙個 扭動的回文串 為如下情況中的乙個 ...

JSOI2016 扭動的回文串

清新結論配上巨大碼量的雜湊解法 第一種情況和第二種情況很容易解決,可以直接求乙個正向雜湊值在求乙個反轉後的雜湊值,然後列舉回文中心,二分擴充套件了多少即可。思考扭動的回文串應該滿足那些特性,首先,一定是一段滿足情況 1 或情況 2 的子串 s 然後左邊新增了一些,右邊新增了一些,很明顯,無論 s 是...

JSOI 2016 扭動的字串

給出兩個長度為 n 的字串 a,b s i,j,k 表示把 a 中的 i,j 和 b 中的 j,k 拼接起來的字串 問所有回文的 s i,j,k 或者 a,b 中的回文子串的最長長度 列舉回文串的中心。可以發現,如果能在當前字串內擴充套件就盡量擴充套件,不能擴充套件了再嘗試和另乙個字串匹配。對於前者...