bzoj1819

水题,上trie,然后穷举每一位的时候判定一下三种编辑

 1 var son:array[0..10010*20,1..26] of longint;
 2     v:array[0..10010*20] of longint;
 3     d:array[0..10010] of boolean;
 4     s:string;
 5     t,i,l,n,m:longint;
 6 
 7 procedure add(w:longint);
 8   var p,i,y:longint;
 9   begin
10     p:=1;
11     for i:=1 to length(s) do
12     begin
13       y:=ord(s[i])-96;
14       if son[p,y]=0 then
15       begin
16         inc(t);
17         son[p,y]:=t;
18       end;
19       p:=son[p,y];
20     end;
21     v[p]:=w;
22   end;
23 
24 function find(p,x:longint):longint;
25   var i,y:longint;
26   begin
27     if p=0 then exit(0);
28     for i:=x to l do
29     begin
30       y:=ord(s[i])-96;
31       if son[p,y]=0 then exit(0)
32       else p:=son[p,y];
33     end;
34     if (v[p]>0) and not d[v[p]] then
35     begin
36       d[v[p]]:=true;
37       exit(1)
38     end
39     else exit(0);
40   end;
41 
42 function ask:longint;
43   var p,i,y,j:longint;
44   begin
45     p:=1;
46     ask:=0;
47     for i:=1 to l do
48     begin
49       for j:=1 to 26 do
50         ask:=ask+find(son[p,j],i)+find(p,i+1)+find(son[p,j],i+1);
51                 // 在i前一位插入      删除      修改
52       y:=ord(s[i])-96;
53       p:=son[p,y];
54       if p=0 then exit;
55     end;
56     for i:=1 to 26 do
57       ask:=ask+find(son[p,i],l+1); //在最后一位插入
58   end;
59 
60 begin
61   readln(n,m);
62   t:=1;
63   for i:=1 to n do
64   begin
65     readln(s);
66     add(i);
67   end;
68   for i:=1 to m do
69   begin
70     fillchar(d,sizeof(d),false);
71     readln(s);
72     l:=length(s);
73     if find(1,1)>0 then writeln(-1)
74     else writeln(ask);
75   end;
76 end.
View Code
原文地址:https://www.cnblogs.com/phile/p/4473022.html