BZOJ2342 雙倍回文(回文自動機 樹上差分)

2021-08-16 04:10:15 字數 887 閱讀 2717

題面

題意:給你乙個串,求出它的最長子串

滿足該子串有兩個長度相等且為偶數的回文串拼接而成

該串顯然是回文串,就對應回文自動機上的乙個狀態

若某個狀態的長度為4的倍數

且存在某個祖先的長度為其一半

則該狀態可以貢獻答案

因為祖先即回文字尾和字首

長度為其一半的字首和字尾都是回文串

顯然符合題意

我的做法是樹上差分

#include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define mmst(a, b) memset(a, b, sizeof(a))

#define mmcp(a, b) memcpy(a, b, sizeof(b))

typedef

long

long ll;

const

int n=500500;

int n,ans;

int son[n][26],pre[n],len[n],cnt,last;

int to[n],nex[n],head[n],cur;

bool ok[n];

char s[n];

void add(int u,int v)

void dfs(int x)

void insert(int pos)

last=son[x][ch];

}int main()

BZOJ2342 雙倍回文

目錄題目傳送門 其實是manacher的題目,但是也是可以用回文自動機做的。構建出回文自動機之後,就可以在回文數上進行dp,如果乙個點代表的回文串的長度為 的倍數,並且存在長度為它一半的字尾,就是乙個滿足答案的回文串。關鍵就在於如何判斷是否有長度為它一半的字尾。我們通過回文自動機可以構建出 fail...

bzoj 2342 雙倍回文 回文自動機

定義雙倍回文串的左一半和右一半均是回文串的長度為4的倍數的回文串 求乙個給定字串中最長的雙倍回文串的長度 我們知道可以簡單地判定以某一點結尾的最長回文串 我們知道可以簡單地判定以某一點開頭的最長回文串 啥?第二個?你把串倒過來不就行了?所以我們列舉雙倍回文串的斷點再判定即可.我們發現我們每次都要取列...

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 ...