题目:
第一行一个字符串A。
第二行一个字符串B。两个字符串保证均只含小写字母。(1<=|A|<=500000,1<=|A|<=100)
第三行一个正整数Q,表示训练次数。(1<=|Q|<=100000)
接下来m行每行两个整数l和r,表示一段区间。(1<= l<=r<=A)
输出:
共Q行,每行一个非负整数,表示出现的次数。
样例输入:
comeonmandontconconnect
on
5
1 5
1 6
1 23
11 16
11 23
样例输出:
0
1
4
2
3
思路:
首先,最容易想到的是锁定A中在(l,r)的区间范围,判断这个区间中B出现的次数。但是时间复杂度太高,而且会有重复运算。所以,我们可以将A整体遍历一遍,A中B出现的索引范围都保存在一个list中。最后,只需判断输入的区间值(l,r)是否包含list保存的区间值,若包含,则计数加一。
代码:
import sys
A = sys.stdin.readline().strip()
B = sys.stdin.readline().strip()
M = int(sys.stdin.readline().strip())
temp = list()
result = list()
for i in range(len(A)):
if A[i:i+len(B)] == B:
temp.append([i,i+len(B)])
for i in range(M):
line = sys.stdin.readline().strip().split()
nums = list(map(int,line))
res = 0
for j in temp:
if nums[0]-1<=j[0] and nums[1]>=j[1]:
res+=1
result.append(res)
for item in result:
print(item)
测试: