1.小红查单词
小红拿到了一个仅由英文字母组成的字符串。她想知道某单词在该字符串中出现了多少次,你能帮帮她吗?
请注意,小红会询问多次。
输入描述
第一行输入两个正整数n和q,代表字符串长度和询问次数。
第二行输入一行长度为n的,仅由小写英文字母组成的字符串。代表小红拿到的字符串。
接下来的q行,每行输入一个仅由小写英文字母组成的字符串,代表小红的每次查询。
1<=n,q<=10^5
每次查询的字符串长度不超过 10。
输出描述
输出q行,每行输出一个整数,代表该次查询的结果。
示例1
输入
10 3
bobobalice
bob
alice
red
输出
2
1
0
思路与代码
# 计算并返回子串 s[l:r+1] 的哈希值,这个哈希值用于快速比较字符串是否相同
def get(l, r):
return h[r] - h[l - 1] * p[r - l + 1]
n, q = map(int, input().split())
s = input()
# h和p数组分别用于存储字符串的哈希值和幂的值
h = [0] * (n + 1)
p = [0] * (n + 1)
base = 13331
h[0] = 0
p[0] = 1
#
for i in range(1, n + 1):
h[i] = h[i - 1] * base + ord(s[i - 1])
p[i] = p[i - 1] * base
# 用于存储查询单词的哈希值以及它们出现的次数
mp = {}
'''
嵌套循环遍历不同长度的子串,并计算它们的哈希值,然后将哈希值作为键,出现的次数作为值存储在 mp 中
'''
# 每次查询的字符串长度不超过 10,所以length的范围是(1,11)
for length in range(1, 11):
for i in range(n):
if i + length > n:
break
now = get(i + 1, i + length)
if now in mp:
mp[now] += 1
else:
mp[now] = 1
# 使用一个循环处理每个查询
for i in range(q):
x = input()
y = 0
# 将查询的字符串计算成一个哈希值 y
for c in x:
y = y * base + ord(c)
# 检查 y 是否在哈希表 mp 中。
if y in mp:
# 如果在 mp 中找到了对应的哈希值
print(mp[y])
else:
print(0)