題面
題意:給你乙個串,求出它的最長子串
滿足該子串有兩個長度相等且為偶數的回文串拼接而成
該串顯然是回文串,就對應回文自動機上的乙個狀態
若某個狀態的長度為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 ...