首先,我们发现这道题可以用的方法来做。
如果
那么:
否则:
另外:
我们用来预处理函数的结果就可以了。不会的请左转。
这道题不卡,所以把模数也调成就行了。
xxxxxxxxxx
const p=163;//相当于base值
q=1000000007;//模数
size=100005;
var hash,f,a:array[0..size] of int64;
s1,s2:ansistring;
i,j,k,t:longint;
sum:int64;
flag:array[0..size] of boolean;
function gethash(l,r:longint):int64;
begin
exit((hash[r]-(hash[l-1]*a[r-l+1]) mod q+q)mod q);//求(l,r)区间的hash值,相当于copy(s,l,r-l+1)
end;
begin
a[0]:=1;
for i:=1 to size-5 do a[i]:=(a[i-1]*p) mod q;//预处理p^i
readln(t);
for k:=1 to t do
begin
readln(s1);
readln(s2);
fillchar(flag,sizeof(flag),0);
sum:=0;
for i:=1 to length(s1) do hash[i]:=(hash[i-1]*p+ord(s1[i])-ord('a')+1) mod q;//为了循环hash,所以先预处理出(1,i)的hash值
for i:=1 to length(s2) do sum:=(sum*p+ord(s2[i])-ord('a')+1) mod q;//求出整个s2的hash值
for i:=length(s2) to length(s1) do
begin
if gethash(i-length(s2)+1,i)=sum then
flag[i]:=true;//如果满足s2=copy(s1,i-len(s2)+1,len(s2))
end;
f[0]:=1;//dp初始化
for i:=1 to length(s1) do
begin
f[i]:=f[i-1];
if flag[i] then
f[i]:=(f[i]+f[i-length(s2)]) mod q;//dp转移方程
end;
writeln('Case #',k,': ',f[length(s1)]);//输出
end;
end.
由于不能自然溢出,所以只能写成这样带模数的了,望通过指正