bzoj2342 Shoi2011 雙倍回文

2022-05-02 05:06:07 字數 1202 閱讀 7526

輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。

輸出檔案只有一行,即:輸入資料中字串的最長雙倍回文子串的長度,如果雙倍回文子串不存在,則輸出0。

16ggabaabaabaaball

12n<=500000

正解:回文自動機。

一道回文自動機的板子題。。我們直接構造字串的$pam$,然後在$fail$樹上$dfs$,找到乙個長度既是$4$的倍數,祖先中又有長度等於它的一半的字串就行了。

1

//it is made by wfj_2048~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include

14#define inf (1<<30)

15#define n (500010)

16#define il inline

17#define rg register

18#define ll long long

19#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

2021

using

namespace

std;

2223

struct edgeg[2*n];

2425

int ch[n][26

],fa[n],l[n],head[n],cnt[n],n,la,sz,num,ans;

26char

s[n];

2728 il int

gi()

3536 il void insert(rg int

from,rg int

to),head[from]=num; return;38

}3940 il void add(rg int c,rg int

n)47 la=ch[x][c]; return;48

}4950 il void dfs(rg int

x)54

55 il void

work()

6061

intmain()

雙倍回文 Shoi2011 bzoj2342

time limit 10 sec memory limit 128 mb submit 2820 solved 1088 submit status discuss 輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。輸出檔案只有一行,即 輸入資料中字串...

bzoj 2342 Shoi2011 雙倍回文

題目大意 演算法一 因為雙倍回文串必定是乙個回文串 所以先用manachar求出每個點能夠擴充套件出的最長的回文串長度f i 再列舉對稱軸x,對於y只要滿足y f y x y x f x 2,就可以用len x,y 4來更新答案 對於每個x,只需要用距離其最遠的滿足條件的y來更新即可 將其按i f ...

SHOI2011 bzoj2342 雙倍回文

description input 輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。output 輸出檔案只有一行,即 輸入資料中字串的最長雙倍回文子串的長度,如果雙倍回文子串不存在,則輸出0。首先由題意可知,只用考慮偶數長的回文串。這樣就不用插入 直...