题目描述
给定字符串 u=u1…un,令 pre(u,i) 表示前缀 u1…ui。特别地,pre(u,0) 是空字符串。
对于两个字符串 u=u1…un 与 v=v1…vm,令 u+v 表示连接后的字符串 u1…unv1…vm。
给定长度为 m 的字符串 t=t1…tm 和一棵有 (n+1) 个节点的树 T,节点编号为 0,1,…,n,其中节点 0 是根。每条边上都有一个字符。请注意,在本题中,字母表中可能会有多于 26 个字符。
考虑如下函数 $$f(i,j) = \max{d(x) \mid s_x\text{ 是 }s_i+ \mathrm{pre}(t,j)\text{ 的后缀}}$$ 其中 si 是从根到节点 i 的最短路径上所有字符连接而成的字符串,d(i) 是从根到节点 i 的最短路径经过的边数。
您需要计算 g1,g2,…,gm,其中 gj=i=1∑nf(i,j)。
请注意,s0 是空字符串,空字符串是任何字符串的后缀。
输入格式
有多组测试数据。第一行输入一个整数 T 表示测试数据组数,对于每组测试数据:
第一行输入两个整数 n 和 m(1≤n,m≤2×105)。
第二行输入 n 个整数 p1,p2,…,pn(0≤pi<i),其中 pi 表示节点 i 的父节点。
第三行输入 n 个整数 c1,c2,…,cn(1≤ci≤n),其中 ci 表示从节点 pi 到节点 i 的边上的字符是字母表中第 ci 个字符。保证对于所有 i=j,有 pi=pj 或 ci=cj。
第四行输入 m 个整数 t1,t2,…,tm(1≤ti≤n),其中 ti 是字符串 t 中的第 i 个字符。
保证所有数据 n 之和与 m 之和均不超过 2×105。
输出格式
每组数据输出一行 m 个由单个空格分隔的整数 g1,g2,…,gm。
请不要在行末输出多余空格,否则您的答案可能会被认为是错误的!
2
11 3
0 1 2 0 4 5 4 6 0 9 10
1 3 2 2 1 3 4 1 3 2 1
3 2 4
5 16
0 0 0 1 4
1 2 3 2 2
2 1 3 3 2 1 3 2 1 3 2 2 1 1 2 1
17 26 22
8 5 5 5 5 5 5 5 5 5 5 5 5 5 10 5
提示
我们来计算第一组样例数据中的 f(11,1) 和 f(11,2) 以便您更好地理解。有 s11={3,2,1},所以 s11+pre(t,1)={3,2,1,3}。因为 s6={2,1,3} 是该字符串存在于树中的最长后缀,所以 f(11,1)=d(6)=3。另外 s11+pre(t,2)={3,2,1,3,2},那么 s3={1,3,2} 是该字符串存在于树中的最长后缀,所以 f(11,2)=d(3)=3。