题目描述
打字机上只有28个按键,分别印有26个小写英文字母和’B’、’P’两个字母。经阿狸研究发现,这个打字机是这样工作的:
·输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后)。
·按一下印有’B’的按键,打字机凹槽中最后一个字母会消失。
·按一下印有’P’的按键,打字机会在纸上打印出凹槽中现有的所有字母并换行,但凹槽中的字母不会消失。
例如,阿狸输入aPaPBbP,纸上被打印的字符如下:
a aa ab 我们把纸上打印出来的字符串从1开始顺序编号,一直到n。打字机有一个非常有趣的功能,在打字机中暗藏一个带数字的小键盘,在小键盘上输入两个数(x,y)(其中1≤x,y≤n),打字机会显示第x个打印的字符串在第y个打印的字符串中出现了多少次。
阿狸发现了这个功能以后很兴奋,他想写个程序完成同样的功能,你能帮助他么?
输入输出格式
输入格式:
输入的第一行包含一个字符串,按阿狸的输入顺序给出所有阿狸输入的字符。
第二行包含一个整数m,表示询问个数。
接下来m行描述所有由小键盘输入的询问。其中第i行包含两个整数x, y,表示第i个询问为(x, y)。
输出格式:
输出m行,其中第i行包含一个整数,表示第i个询问的答案。
输入输出样例
输入样例:
aPaPBbP
3
1 2
1 3
2 3
输出样例:
2
1
0
说明
数据范围:
对于100%的数据,n<=100000,m<=100000,第一行总长度<=100000。
分析
AC自动机已经手生到错了一片。。。
先将输出串存在trie上,在trie上构建AC自动机
可以看出要求出对于root-x
的点上有多少个节点能通过跳fail指针跳到y串的结束节点
所以将fail指针反向建树(fail树
)
因为如果x节点能跳到y节点,x节点一定是y节点fail树上的子树,这个就用dfn序列判断
将每组询问存在相应节点上
再次dfs,将root-x
的dfn状况储存在树状数组+判断与x相关的询问就行
CODE
|
|