Description
给出一个长度为
n
的
两个
现在给出若干个
01
串进行询问,对于每一个被询问的
01
串,求
S
有多少个子串与每一个被询问的
Data Constraint
n
<=
Solution
一次匹配的复杂度为
O
(
若每一次询问串的长度都大于
P−−√
(
P
=
但询问串的长度不一定都大于
P−−√
,因此可以先预处理出所有长度小于
P−−√
的情况,预处理出
F
数组,
Code(Pascal)
var
i,k,l,j,o,p,q,ans:longint;
f:array[0..500,0..1000] of longint;
zj:array[0..250000] of longint;
st:ansistring;
begin
readln(st);
p:=length(st);
for i:=1 to p do
if st[i]='1' then zj[i]:=zj[i-1]+1 else zj[i]:=zj[i-1];
o:=trunc(sqrt(p));
for i:=1 to o do
for l:=i to p do
inc(f[i,zj[l]-zj[l-i]]);
readln(q);
for i:=1 to q do
begin
readln(st);
k:=length(st); j:=0;
for l:=1 to k do if st[l]='1' then inc(j);
if k<=o then writeln(f[k,j])
else
begin
ans:=0;
for l:=k to p do if zj[l]-zj[l-k]=j then inc(ans);
writeln(ans);
end;
end;
end.