回文樹(回文自動機),他的功能如下: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...