NKSEV - Tách từ
Tác giả: flashmt
Ngôn ngữ: Pascal
const fi='';
z=1337377;
type pointer=^node;
node=record
cnt:longint;
next:array['a'..'z'] of pointer;
end;
var n,i,j:longint;
a,s:ansistring;
top:pointer;
f:array[0..300030] of longint;
function create:pointer;
var c:char; p:pointer;
begin
new(p); p^.cnt:=0;
for c:='a' to 'z' do p^.next[c]:=nil;
exit(p);
end;
procedure put(p:pointer;pos:longint;s:ansistring);
var t:pointer;
begin
if p^.next[s[pos]]=nil then p^.next[s[pos]]:=create;
t:=p^.next[s[pos]];
if pos<length(s) then put(t,pos+1,s)
else inc(t^.cnt);
end;
procedure check(p:pointer;pos,x:longint);
var t:pointer;
begin
if p^.next[a[pos+x]]=nil then exit;
t:=p^.next[a[pos+x]];
if t^.cnt>0 then
begin
f[pos+x]:=f[pos+x]+f[x];
if f[pos+x]>=z then f[pos+x]:=f[pos+x]-z;
end;
if (pos<100) and (pos+x<n) then check(t,pos+1,x);
end;
begin
assign(input,fi); reset(input);
readln(a);
readln(n);
top:=create;
for i:=1 to n do
begin
readln(s);
put(top,1,s);
end;
n:=length(a);
f[0]:=1;
for i:=0 to n-1 do check(top,1,i);
writeln(f[n]);
close(input);
end.