小G的项链(Manacher)
我看網(wǎng)上也沒(méi)有寫(xiě)這個(gè)題的,順便寫(xiě)一下(可能是大佬都覺(jué)得太簡(jiǎn)單了 )
鏈接:牛客網(wǎng)
時(shí)間限制:C/C++ 1秒,其他語(yǔ)言2秒 空間限制:C/C++ 32768K,其他語(yǔ)言65536K 64bit IO Format:
%lld
題目描述
有一串有n顆珠子的項(xiàng)鏈,每顆珠子上有一個(gè)數(shù)字,從順時(shí)針?lè)较蚩匆来问堑?,2,…,n個(gè)珠子,第n個(gè)珠子之后是第1個(gè)珠子。但是小G覺(jué)得這串項(xiàng)鏈的造型不夠美觀,他決定用這串項(xiàng)鏈上的珠子造出一個(gè)新的項(xiàng)鏈,并且他希望這串新的項(xiàng)鏈?zhǔn)菍?duì)稱的。
一串項(xiàng)鏈?zhǔn)菍?duì)稱的,當(dāng)且僅當(dāng)存在至少一顆珠子滿足:把它作為起始位置(即順時(shí)針和逆時(shí)針?lè)较驍?shù)第0個(gè)珠子),對(duì)于任意的自然數(shù)i,順時(shí)針數(shù)第i個(gè)珠子上的數(shù)字和逆時(shí)針數(shù)第i個(gè)珠子上的數(shù)字相同。特別的,一個(gè)僅有一顆珠子的項(xiàng)鏈也是對(duì)稱的。
小G可以使用合成技術(shù)將任意正整數(shù)顆珠子合成為一個(gè)新的珠子,新珠子上的數(shù)字=原珠子上的數(shù)字的異或和。
用合成技術(shù)造出新項(xiàng)鏈的過(guò)程是這樣的:最開(kāi)始由小G確定一個(gè)能整除n的正整數(shù)k和一個(gè)原項(xiàng)鏈中的起始位置,之后從起始位置開(kāi)始順時(shí)針?lè)较蛉∵B續(xù)的k個(gè)珠子,合成一個(gè)新的珠子作為新項(xiàng)鏈的第1個(gè)珠子,再取接下來(lái)連續(xù)的k個(gè)珠子,合成一個(gè)新的珠子作為新項(xiàng)鏈的第2個(gè)珠子,……,直到取完原項(xiàng)鏈的所有珠子為止。注意,合成的新珠子會(huì)直接放到新項(xiàng)鏈的位置,并不會(huì)插入原項(xiàng)鏈之中參與之后合成過(guò)程。新項(xiàng)鏈同樣滿足從順時(shí)針?lè)较蚩匆来问堑?,2,…,n個(gè)珠子,第n個(gè)珠子之后是第1個(gè)珠子。
小G希望新的項(xiàng)鏈上的珠子盡可能多,問(wèn)新項(xiàng)鏈上的珠子最多有多少個(gè)。
輸入描述:
第一行一個(gè)整數(shù)n。
第二行n個(gè)整數(shù),第i個(gè)整數(shù)ai代表原項(xiàng)鏈上第i個(gè)珠子上的數(shù)字。
輸出描述:
共一行一個(gè)整數(shù),代表新項(xiàng)鏈的最大珠子數(shù)量。
示例1
輸入
輸出
5示例2
輸入
輸出
3備注:
1 ≤ n ≤ 2 x 105,0 ≤ ai ≤ 109
題意:
給你n個(gè)數(shù)組成環(huán),分成k個(gè)等長(zhǎng)的區(qū)間,每個(gè)區(qū)間的值就是區(qū)間內(nèi)部數(shù)的異或和,用區(qū)間的相對(duì)位置擺成環(huán),且使這個(gè)環(huán)組成回文串,問(wèn)你回文串最長(zhǎng)是多少?
題解:
因?yàn)閚個(gè)數(shù)組成環(huán),所以我們先把環(huán)破開(kāi),就是環(huán)翻倍(n+n),讓尾連頭。然后求出所有前綴異或和pre
因?yàn)橐裯分成長(zhǎng)度為len的num個(gè)區(qū)間。
我們要嘗試len的每一種情況,讓每個(gè)區(qū)間內(nèi)的len個(gè)數(shù)異或和,然后看組成的是不是回文串,找到最大的len情況。
因?yàn)槲覀円婚_(kāi)始將2*n個(gè)數(shù)都存了前綴異或和,根據(jù)異或的性質(zhì),a^a=0,所以我就可以通過(guò)前綴異或和輕松算出每個(gè)區(qū)間的異或值(比如pre[3] ^ pre[6]算出來(lái)就是區(qū)間[4,6]的異或和,因?yàn)?之前的重復(fù)就消除了)
求出每區(qū)間的異或和放在一個(gè)數(shù)組b中,再求b是否為回文串。但注意b是一個(gè)環(huán)直接判斷可能不對(duì)(比如abb不是回文串,但是abb是一個(gè)環(huán)如果你用正確的打開(kāi)方式,它也可以是bab,那就是回文串了),那該怎么辦?對(duì),既然是環(huán)我們就給它拆成鏈,我們把項(xiàng)鏈倍長(zhǎng),如果倍長(zhǎng)后的字符串中存在一個(gè)子串是回文串且長(zhǎng)度超過(guò)了倍長(zhǎng)前字符串的長(zhǎng)度,顯然是存在對(duì)稱軸的。
(還是abb,拆之后就是abbabb,看這個(gè)最長(zhǎng)回文串的長(zhǎng)度(5)是否大于本身(3))
至此基本上就大功告成了
什么?你說(shuō)用什么求回文串,(那肯定暴力 )當(dāng)然用Manacher
b站講解Manacher
附碼:
總結(jié)
以上是生活随笔為你收集整理的小G的项链(Manacher)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux的链接文件分为(linux的链
- 下一篇: 大吉大利【牛客网】(牛客练习赛60)