给定一棵根节点为1的树,每个节点上有一个字母。进行q次询问,每次询问两个节点u和v,判断从u到v的路径上的字母序列是否存在子序列"BUG"。若存在则输出"NO",否则输出"YES"。
这题的核心是判断树中从节点 u
到节点 v
的路径上的字母序列是否包含子序列 "BUG"。为了高效处理多次询问,需要对树进行预处理,利用树链剖分将树分解为多条链,并预处理每条链的状态转移函数。通过最近公共祖先(LCA)算法快速定位路径,将路径分解为上行和下行部分,分别应用预处理的状态转移函数,判断是否形成 "BUG" 子序列。最终根据状态转移结果回答每次询问。
小美有一个结点总数为 n 且根节点编号为 1 的有根树。
第 i 个结点的编号为 i ,所携带的字母为 ai。
小美是一名程序员,她认为一对 (u,v) 是好对,当且仅当从节点 u 到节点 v 的简单路径上依次拼接得到字符串 S 的子序列中不存在"BUG"。
小美会提出 q 次询问,你需要帮助她回答(u,v)是不是好对。
子序列:子序列是原始序列的一个子集,其元素顺序保持不变,但可以选择性地删除一些元素。换句话说,子序列是从原始序列中挑选出来的元素集合,这些元素在原始序列中的相对顺序保持一致。
例如:S=BAUCDEG,"BUG"为字符串 S 的一个子序列,但"BGA"不是 S 的子序列。
第一行两个整数 n,q(3≤n,q≤105),分别表示节点个数和询问次数。
第二行 n 个整数,第 i 个为 fatheri(1≤fatheri≤i−1),表示第 i 个节点的父节点,特别的 father1=0 。
第三行 n 个字母,第 i 个为 ai(′A′≤ai<′Z′),表示第 i 个节点所携带的字母。
接下来 q 行,每行两个墪数 u,v(1≤u=≤n),表示询问的起点和终点。
共 q 行,每行一个字符串,若 (u,v) 是好对输出"YES",否则输出"NO"。
输入
5 3
0 1 1 2 2
AUGBC
4 3
4 5
4 1
输出
NO
YES
YES