回文自動機

2021-09-26 02:42:37 字數 1011 閱讀 2714

回文樹(回文自動機),他的功能如下:

求字首字串中的本質不同的回文串種類

求每個本質不同回文串的個數

以下標每個本質不同回文串包含的本質不同回文串種類

fail:fail指標,類似於ac自動機,返回失配後與當前cnt:在最後統計後它可以表示形如以

num:表示以

len:表示以

s:存放新增的字元

n:表示字元陣列的第幾位

p:表示樹中節點的指標

構造回文樹需要的空間複雜度為o(n * 字符集大小),時間複雜度為o(n * log(字符集大小) )

模板:

#includetypedef long long ll;

const int maxn = 3*100005 ;

const int n = 26 ;

char s[maxn];

struct palindromic_tree

void init ()

int get_fail ( int x )

return x ;

}void add(int c)

last = nxt[cur][c];

cnt[last]++;

}void dfs(int x)

v[x]--;

v[fail[x]]--;

}/**求回文串有多少個本質不同的回文串是另乙個回文串的子串,共有多少對**/

ll count1 ()

return ans;

}/**統計本質相同的回文串出現的次數**/

void count2()

}pt ;

int main()

ll ans = pt.count1();

printf("case #%d: %lld\n", cas, ans);

}return 0;

}

回文自動機

回文自動機,又叫回文樹,是由俄羅斯人 mikhailrubinchik於2014年夏發明的 這是一種比較新的資料結構,在原文中已有詳細介紹與 實現。回文樹其實不是嚴格的樹形結構,因為它有是兩棵樹,分別是偶數長度的回文樹和奇數長度的回文樹,樹中每個節點代表乙個回文串。為了方便,第一棵樹的根是乙個長度為...

回文自動機

乙個節點表示乙個回文串。tot 節點個數,即不同回文串的個數。兩棵樹,節點為0,1,所以最後計數時從2開始 n 新增的字元個數 last 新新增乙個字母後所形成的最長回文串表示的節點 nxt i c 節點i表示的回文串在兩邊新增字元c後變成的回文串編號 兒子 cnt i 節點i表示的本質不同的串的個...

回文自動機

小小總結 別忘了寫上初始化!當字串下標從0 00開始時,pos pospo s初始化為 1 1 1 若從1 11開始,則pos pospo s初始化為0 00 最終的pos pospo s代表最後乙個字元的下標 前者為n 1 n 1n 1,後者為n nn 根據本質不同的回文子串數量不超過 s s s...