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.

Download