回文樹模板練習 UVaLive7041

2021-09-27 01:44:07 字數 930 閱讀 5248

給出兩個僅包含小寫字元的字串 a 和 b ; 求:對於 a 中的每個回文子串,b 中和該子串相同的子串個數的總和。

回文樹基礎題,我們對兩個串分別構建兩個回文樹,因為回文樹中的節點代表著回文串,所以只需要用dfs判斷,在pam1中有值的節點,在pam2中是否有值,如果有,則說明b中也有這個子串,答案加上兩者數量的乘積。

所以最後我們需要從兩棵樹的兩個起點0,0和1,1分別dfs一遍統計答案。

為什麼又兩個起點呢?因為回文樹中,0和1分別表示長度為偶數和基數的回文串的個數。

#include using namespace std;

const int maxn=300000+10;

const int n=28;

int id[maxn];

typedef long long ll;

struct palindromic_tree

void init ()

int get_fail ( int x )

void add ( int c )

last = next[cur][c] ;

cnt[last] ++ ;

id[last]=n;//當前回文子串結尾的地方+1

} void count () }*/

}};palindromic_tree pam1,pam2;

ll ans;

void dfs(int u,int v)

}}char s1[maxn],s2[maxn];

signed main()

for(int i=0;ipam1.count(),pam2.count();

dfs(0,0);

dfs(1,1);

printf("%lld\n",ans);

}return 0;

}

回文樹 模板

類似ac自動機,樹裡面每個節點代表主串的乙個回文子串,且每個回文子串都不同 主要功能 1.求串s字首0 i內本質不同回文串的個數 兩個串長度不同或者長度相同且至少有乙個字元不同便是本質不同 2.求串s內每乙個本質不同回文串出現的次數 3.求串s內回文串的個數 4.求以下標i結尾的回文串的個數 con...

回文樹練習題

貼 改 模板大集合系列 大概包括了pam的這些問題 1.sz的意義 本質不同的回文子串個數 2.cnt的意義 當前回文子串出現的次數 3.num的意義 靠最右邊的回文子串個數 新加乙個字元產生的回文子串個數 暴力fail的層數 4.half的意義 長度小於等於當前回文子串的一半的回文字尾的節點 5....

回文樹(自動機) 練習和總結

回文樹是一種強大的回文字串處理演算法,他的構造過程實際上和kmp多少有些相似,這裡講的很是仔細。下面摘錄幾個例題。ural 1960 palindromes and super abilities 每次加乙個新節點,說明了有乙個新的回文串產生。這個感覺真的很重要啊 我們在自動機裡記錄一下就好 ura...