牛客競賽 最長回文(馬拉車)

2021-09-25 15:44:10 字數 1455 閱讀 2388

題目描述

有兩個長度均為n的字串a和b。可以從a中選乙個可以為空的子串a[l1…r1],b中選乙個可以為空的子串b[l2…r2],滿足r1=l2,然後把它們拼起來(a[l1…r1]+b[l2…r2])。求用這樣的方法能得到的最長回文串的長度。注意:求的不是本質不同的回文串個數哦!!!

輸入描述:

第一行乙個數n

第二行表示字串a

第三行表示字串b

輸出描述:

輸出一行乙個數表示答案

示例1

輸入

5

zqzfc

nszxl

輸出

3
說明

a[1..3]=「zqz」,為乙個長為3的回文串,b空
示例2

輸入

7

nszqzfc

cfzqzsn

輸出

8
說明

a[1..4]=」nszq」

b[4..7]=」qzsn」

拼起來是」nszqqzsn」,為乙個長為8的回文串

備註:對於100%的資料,有1 <= n <= 100000 , 字元全是大寫英語字元

馬拉車先求出兩個字串的p【i】,最長回文串。

然後讓他們互相匹配。

code

#include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxn=2e6+5;

int p[maxn],p1[maxn];

void manacher1(char *s,int len)

}}void manacher2(char *s,int len)

}}char a[maxn],b[maxn];

int main()

a[0]='@';

b[0]='@';

manacher1(a,n*2+2);

manacher2(b,n*2+2);

int ans=1;

n=n*2+2;

for(int i=2;iprintf("%d\n",ans-1);

return 0;

}

牛客 小A的回文串 最長回文串,馬拉車演算法

題目 題目鏈結 小a只想知道給定的乙個字串的最大回文子串是多少,現在小a可以對這個字串做一些改動,他可以把這個字串最前面的某一段連續的字元 不改變順序 移動到原先字串的末尾。那麼請問小a通過這樣的操作之後 也可以選擇不移動 能夠得到最大回文子串的長度是多少。思路 1列舉所有字串 使用馬拉車演算法 2...

最長回文 馬拉車演算法

總時間限制 10000ms 單個測試點時間限制 1000ms 記憶體限制 5120000kb描述 給出乙個只由小寫英文本元a,b,c.y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 輸入乙個檔案一組資料 每組輸入為一行小寫英文本元a,b,c.y,z組成...

最長回文串(馬拉車演算法)

最長回文子串 manacher演算法 馬拉車演算法 馬拉車演算法需要計算以每個字元為中心的回文串半徑。並記錄最右邊界 馬拉車演算法基於這樣乙個事實,從回文串的中心到兩邊是對稱的,意味著以兩邊對稱的字元為中心的回文串半徑相等 在不超過最右邊界的情況下,如果超出就需要擴充套件搜尋 public stri...