您的位置:首页 > 其它

[Tyvj1228 有道搜索框]

2011-11-09 17:35 363 查看
[题目来源]:tyvj1128

[关键字]:字典树

[题目大意]:给出一个字典。接着输入字符串s查询最多前8个依次为前缀的字典中的单词,如没有只输出s。

//============================================================================================================

[分析]:用字典树,首先将每个单词插入字典树,然后寻找到s插入字典树后在字典树中的节点,以此为起点进行dfs,如果s无法插入树中说明没有依次为前缀得单词。

[代码]:

View Code

program Project1;
type
rec = record
dat: array['a'..'z'] of longint;
f: boolean;
s: string;
end;
var
tot, tn, n, q: longint;
tree: array[0..2000000] of rec;

procedure inser(s: string);
var
i, now: longint;
begin
now := 1;
for i := 1 to length(s) do
if tree[now].dat[s[i]] <> 0 then now := tree[now].dat[s[i]]
else
begin
inc(tn);
tree[tn].f := false;
tree[now].dat[s[i]] := tn;
now := tn;
end;
tree[now].s := s;
tree[now].f := true;
end;

procedure dfs(k: longint);
var
ch: char;
begin
if tree[k].f then
begin
inc(tot);
write(tree[k].s,'');
end;
for ch := 'a' to 'z' do
begin
if tree[k].dat[ch] <> 0 then dfs(tree[k].dat[ch]);
if tot = 8 then exit;
end;
end;

procedure find(s: string);
var
now, i: longint;
begin
now := 1;
for i := 1 to length(s) do
if tree[now].dat[s[i]] <> 0 then now := tree[now].dat[s[i]]
else exit;
dfs(now);
end;

procedure init;
var
i: longint;
s: string;
begin
readln(n);
tn := 1;
for i := 1 to n do
begin
readln(s);
inser(s);
end;
readln(q);
for i := 1 to q do
begin
readln(s);
tot := 0;
find(s);
if tot = 0 then writeln(s) else writeln;
end;
end;

begin
//assign(input,'c:\1.in');reset(input);
assign(output,'c:\1.out');rewrite(output);
init;
close(input);
close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: