共T组数据,对于每组数据,给你一个只包含 0-9 的长度为 n
(
n
<
=
1
0
5
)
(n<=10^5)
(n<=105) 的 字符串 a,要求其中有多少个子串满足:
(
∑
i
=
l
r
a
i
=
r
−
l
+
1
)
( \sum_{i=l}^r {a_i} = r-l+1)
(i=l∑rai=r−l+1)
思路:
设
s
u
m
i
sum_i
sumi表示前
i
i
i 个元素的和,那么
(
∑
i
=
l
r
a
i
=
s
u
m
r
−
s
u
m
l
−
1
)
( \sum_{i=l}^r {a_i} = sum_r-sum_{l-1})
(i=l∑rai=sumr−suml−1)
s
u
m
r
−
s
u
m
l
−
1
=
r
−
(
l
−
1
)
sum_r-sum_{l-1}=r-(l-1)
sumr−suml−1=r−(l−1) =>
s
u
m
r
−
r
=
s
u
m
l
−
1
−
(
l
−
1
)
sum_r-r=sum_{l-1}-(l-1)
sumr−r=suml−1−(l−1) (这个技巧很常见)
此时考虑每个以
a
r
a_r
ar 结尾的子串,只要前面有
l
l
l 满足上式即可,找与
s
u
m
r
−
r
sum_r-r
sumr−r 相等的个数结合map即可,时间复杂度 O(nlogn).