tyvj1161聚会的名单(trie树)

背景 Background
明天就是candy的生日,candy又会邀请自己的一大堆好友来聚会了!哎!又要累坏飘飘乎居士了!!
描述 Description
    明天就是candy的生日。晚上,candy找到了飘飘乎居士。她给了飘飘乎居士一张名单,名单上记录了n个candy的好朋友。可是,飘飘乎居士发现,名单上有好多重复的名字啊,这可急坏了飘飘乎居士。所幸,飘飘乎居士找到了自己的oi朋友,希望能够帮助自己。飘飘乎居士会问某个名字,而你要做的任务就是计算出名单中出现了几次该名字。
题解:
 trie模板题,贴一下网上抄来的模板……
type node=record
     got:longint;
     next:array['a'..'z'] of longint;
     end;
var t:array[0..1000000] of node;
    s:string;
    n,m,i,tot:longint;
procedure getintree(s:string);
 var i,now:longint;
 begin
  now:=1;
  for i:=1 to length(s) do
   if t[now].next[s[i]]<>0 then now:=t[now].next[s[i]]
   else begin
         inc(tot);
         t[tot].got:=0;
         fillchar(t[tot].next,sizeof(t[tot].next),0);
         t[now].next[s[i]]:=tot;
         now:=tot;
        end;
  inc(t[now].got);
 end;
function check(s:string):longint;
 var i,now:longint;
 begin
  now:=1;
  for i:=1 to length(s) do
    if t[now].next[s[i]]<>0 then now:=t[now].next[s[i]] else exit(0);
  exit(t[now].got);
 end;
begin
 tot:=1;
 t[1].got:=0;
 fillchar(t[1].next,sizeof(t[1].next),0);
 readln(n);
 for i:=1 to n do
  begin
   readln(s);
   getintree(s);
  end;
 readln(m);
 for i:=1 to m do
  begin
   readln(s);
   writeln(check(s));
  end;
end.

 

posted @ 2014-06-04 19:11  ZYF-ZYF  Views(222)  Comments(0Edit  收藏  举报