#include #include using namespace std; using namespace atcoder; #define emb emplace_back using ll = long long; class EulerTour{ int N; vector in,out; fenwick_tree B_v; public: EulerTour(vector> &G):N(G.size()),in(N),out(N),B_v(N*2){ int f = 0,cnt = 0; vector itr(N),par(N); par[f] = -1; while(f != -1){ if(itr[f] == 0) in[f] = cnt++; if(itr[f] == G[f].size()){ out[f] = cnt++; f = par[f]; continue; } par[G[f][itr[f]]] = f; f = G[f][itr[f]++]; } } void add(int p,int num=1){B_v.add(in[p],num);B_v.add(out[p],-num);} int query(int p){return B_v.sum(0,in[p]+1);} }; int main(){ cin.tie(0);ios::sync_with_stdio(false); //入力 int N;cin >> N; vector S(N); for(string &s:S) cin >> s; int Q;cin >> Q; vector T(Q),X(Q);vector C(Q);//Tはクエリのタイプ for(int i=0;i> T[i] >> X[i];X[i]--; if(T[i] == 1) cin >> C[i]; } //クエリ全処理後のTrie木をつくる vector> path(N,vector({0}));//各文字列の文字ごとのnodeのindex int V = 1; vector> nex(1,vector(26,-1)); vector S2 = S; for(int i=0;i(26,-1)); } now_node = nex[now_node][z]; path[i].emplace_back(now_node); } } //ただの根付き木にする vector> G(V); for(int i=0;i