E. Tree-String Problem (AC自动机+fail树)
https://codeforces.com/problemset/problem/291/E 题意:给你一颗树,然后每一条边有一个字符串,然后给你一个字符串,问这个字符在所有的树的根到叶子结点练成的串中,出现了多少次。 做法:建立AC自动机,每个点进行计数,在对询问串建AC自动机时不需要计数,然后dfs遍历fail树进行计数就可以了。 # include "bits/stdc++.h" using namespace std ; typedef long long ll ; const int maxn = 300000 + 10 ; const ll mod = 1000000000 + 7 ; # define lowbit(x) x&-x int nxt [ maxn ] [ 26 ] , fail [ maxn ] , sum [ maxn ] , tot ; int modify ( string s , int now , int f ) { int len = s . size ( ) ; for ( int i = 0 ; i < len ; i ++ ) { int id = s [ i ] - 'a' ; if ( nxt [ now ] [ id ] == 0 ) nxt [ now ] [ id ] = ++ tot ; now = nxt [ now ]