题解:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int trie[maxn][26];//trie[i][j]表示编号为i的结点 的代表字母j的子结点
int tot;//字典树结点个数
int fail[maxn];//fail[i]指向 根结点到结点i组成的字符串的最大后缀 的结点,如
/* 0
/ \
1(s) 4(h)
/ \
2(h) 5(e)
/
3(e)
3指向5,2指向4
*/
void get_fail(){//bfs更新fail数组
queue<int> q;
for(int i = 0; i < 26; i++){
if(trie[0][i]){
fail[trie[0][i]] = 0;//第二层结点fail指向0,入队
q.push(t