hdu 1671 Phone List 字典树

来源:互联网 发布:剑三脸型数据怎么导入 编辑:程序博客网 时间:2024/06/06 07:20

题目:判断输入的电话号码中是否有号码是其他号码的前缀。

方法:很裸的字典树。在判断一个字符串是否是某个字符串的前缀时,就判断该字符串所属的节点(深度最大的那个)是否还有子节点就好了。

代码:

var  n,a1,i,l,t:longint;  str:array[1..10000] of string;  a:array[1..100000] of longint;  s:array[1..100000] of char;  son:array[1..100000,1..10] of longint;  flag:boolean;procedure insert(x:longint;str:string);var  i:longint;begin  if str='' then exit;  for i:=1 to a[x] do    if s[son[x,i]]=str[1] then    begin      delete(str,1,1);      insert(son[x,i],str);      exit;    end;  inc(a1);  inc(a[x]);  a[a1]:=0;  son[x,a[x]]:=a1;  s[a1]:=str[1];  delete(str,1,1);  insert(a1,str);end;function find(x:longint;str:string):boolean;var  i:longint;begin  if str='' then    if a[x]>0      then exit(true)      else exit(false);  for i:=1 to a[x] do    if s[son[x,i]]=str[1] then    begin      delete(str,1,1);      find:=find(son[x,i],str);      exit;    end;end;begin  readln(t);  for l:=1 to t do  begin    readln(n);    a1:=1;    a[1]:=0;    for i:=1 to n do    begin      readln(str[i]);      insert(1,str[i]);    end;    flag:=true;    for i:=1 to n do      if find(1,str[i]) then      begin        flag:=false;        break;      end;    if flag      then writeln('YES')      else writeln('NO');  end;end.


0 0
原创粉丝点击