1、30分做法
枚举子串,对于每个子串枚举前缀,并与后缀判断比较,时间复杂度(L3),空间复杂度(L)
const oo=1000000007;maxn=1000000+10; var t,i1,len,i,j:longint; num:array[0..maxn] of int64; ans:int64; s,s1,s2:ansistring; begin readln(t); for i1:=1 to t do begin readln(s); len:=length(s); ans:=1; for i:=1 to len do begin num[i]:=0; for j:=1 to i div 2 do begin s1:=copy(s,1,j); s2:=copy(s,i-j+1,j); if s1=s2 then inc(num[i]); end; ans:=ans*(num[i]+1) mod oo; end; writeln(ans); end; end.
2、100分做法
一眼看去像KMP 然而KMP学一次忘一次
woc我也不知道该怎么讲贴个标程算了
时间复杂度(L),空间复杂度(L)
const oo=1000000007;maxn=1000000+10; var t,i1,len,i,j:longint; num,next:array[0..maxn] of int64; ans:int64; s:ansistring; begin readln(t); for i1:=1 to t do begin readln(s); len:=length(s); j:=0;num[1]:=1; for i:=2 to len do begin while (j>0)and(s[j+1]<>s[i]) do j:=next[j]; if s[j+1]=s[i] then inc(j); next[i]:=j; num[i]:=num[j]+1; end; j:=0;ans:=1; for i:=2 to len do begin while (j>0)and(s[j+1]<>s[i]) do j:=next[j]; if s[j+1]=s[i] then inc(j); while 2*j>i do j:=next[j]; ans:=ans*(num[j]+1) mod oo; end; writeln(ans); end; end.