找到子树

时间:2018-02-14 05:31:52

标签: algorithm dictionary data-structures tree

您将获得一个带有N个节点的带根树。每个节点都包含一个小写英文字母。标签为1的节点是根。 表格有Q问题, X S:这里X是子树的根,S是一个字符串。

对于每个问题,让T为使用根X的子树节点中的所有字符构建的字符串(每个子树节点字符恰好一次)。 对于每个问题,打印要添加到T的最小字符数,以便我们可以使用字符串T的某些字符构建S. (字符串T的每个字符最多可以使用一次)。

输入格式:

第一行输入由两个空格分隔的整数组成 N和Q分别是树中的节点数和问题数。 下一行将包含 N空格分隔小写英文字母,其中第i个字母将是存储在带有标签i的节点中的字母。 下一个N-1行中的每一行包含两个空格分隔的整数 u和v表示在带有标签u和v的节点之间存在边缘 下一个Q线跟随。每行将包含一个整数 X表示节点标签和字符串 S由单个空格分隔。

输出格式:

对于每个查询,请在新行中打印所需答案。

输入约束 2≤N≤105 1≤Q≤105 1≤u,v≤N;!ü= V 1≤X≤N

节点和字符串中的所有字符都是小写英文字母。 所有问题中字符串长度的总和最多为10 ^ 6

示例输入

8 3

o v s l v p d i

1 3

8 3

4 8

6 1

5 3

7 6

2 3

7 ifwrxl

4 pyljywnm

3 llvse

示例输出:

6

7

2

解释

查询1-子树中带有根7的字符是d,我们需要6 字符(i,f,w,r,x,l)使S =(ifwrxl)。

查询2-根4中的字符是l,我们需要7个字符(e,y,j,y,w,n,m)来使S =(eyljywnm)。

查询3-子树中根3的字符是(v,s,i,l),我们需要2个字符(l,e)来使S =(llvse)。

2 个答案:

答案 0 :(得分:1)

我们可以使用带有头部,向下指针,左指针的多级链接列表来维护节点级别。并将查询给出的节点迭代到多级链表中,然后将查询字符串与向下指针节点进行比较。

答案 1 :(得分:0)

由于quires非常高func login() { app.buttons["Have an account? Log in"].tap() let emailAddressTextField = app.textFields["Email Address"] let passwordSecureTextField = app.secureTextFields["Password"] let successLabel = app.staticTexts["Success!"] emailAddressTextField.tap() emailAddressTextField.typeText(EMAIL_ALPHA_USER) passwordSecureTextField.tap() passwordSecureTextField.typeText(PASSWORD) if waitFor(successLabel, to: .appear) { app.buttons["OK"].tap() } } ,因此对子树进行迭代并使用给定字符串的频率进行检查将不是一个有效的方法。您可以使用(10^5 )轻松解决此类问题。因此,每个查询都可以MO's algorithm in tree复杂度解决,从而导致整体Sqrt(N)复杂度。
您可以查看this以获取有关MO算法的更多详细信息。

  

注意:如果需要,我可以提供实施细节。