傳說中的馬拉車演算法233
(先吐槽,manacher我一直覺得打成manachar比較對2333)
manachar的第一步(很神奇的一步),就是把原串每個字元中間再加上乙個原串沒有出現的字元,為什麼這樣搞呢?
自己可以畫乙個圖看一下:2333其實加上直接,原來的回文長度就都是奇數了。
然後有2個變數,mx和id,表示id位置的回文長度最大,到了mx位。還有乙個p陣列,表示每個位置的回文長度。最後的答案就是max-1(不要問為什麼)
那麼這些東西是怎麼work(用高大上的詞彙)的呢?
大概的意思就是利用了回文的性質,用 i 關於 id 的對稱點 j 來更新 i 的答案,當然是在 i然後剩下不知道的再暴力匹配就好。
因為這個東西的mx就正好跑完乙個串,所以複雜度肯定是o(n)的啊233
裸題:
1 #include 2 #include 3 #include 4 #include 5 #include 6#define ll long long
7using
namespace
std;89
const
int maxn=233333;10
11int len[maxn<<1
];12
char
a[maxn];
1314
int manachar(char *p)
1524 s[l++]='
~'; s[l]=0;25
int mx=0,pos=0,ans=0;26
for (int i=1; i)
2733
return ans-1;34
}3536int
main()
37
HDU 3068 最長回文
題 目 鏈 接 看完後自己寫了一遍,感覺真的是很神奇的結論啊!本來這題看到可以用字尾陣列來寫的,但沒有學過,去看了一下,真心給暈了,決定找個機會認真研究下。我的 include include includeusing namespace std define min a,b a b a b cha...
HDU 3068 最長回文
存在o n 的演算法,學習了一下 include include includeusing namespace std const int maxn 300011 int n,p maxn char str maxn in maxn int main str 0 str 1 n n 2 2 str ...
HDU 3068 最長回文
problem description 給出乙個只由小寫英文本元a,b,c.y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 input 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c.y,z組成的字串s 兩組case之間由空行...