NOIP2018複習 字典(字典樹)

2021-09-30 16:48:41 字數 2552 閱讀 7146

第一行兩個數n,m,表示有n個字串,m個詢問。

接下來n行,每行乙個字串ti 。

再接下來m行,每行乙個字串si 。

output

對於每個詢問,輸出乙個ansi表示答案。

題解:看到字首和只有abc,想到字典樹

先對原始的字串建立trie,對trie上每乙個點建立形如(1,0,0,1)的陣列,記錄第i個原始串是否能匹配。在匹配模式串的時候就可以很容易得到答案。但是這麼做會炸記憶體。

進一步思考可以發現,對於每個點上類似於(1,0,0,1,0,1)的陣列,相鄰的兩個1對後續沒有影響。因此在建樹時,我們用乙個ans陣列記錄以第i個點為結尾的模式串的答案。對於ans[i],當有模式串匹配到i點時,ans[i]=max(ans[i],time-last[i]-1) ,time指當前原始串的序號,last[i]指上乙個匹配到該位置的原始串序號,即(1,0,0,1,0,1)中兩個1的間隔。 

注意:每個字串的最後乙個位置一直到n也是乙個合法區間,不能遺漏,最終輸出時比較max(ans[x],n-last[x])

const

maxn=100000;

maxm=5000000;

inf='word.in';

ouf='word.out';

var ans,last:array[0..maxm]of longint;

trie:array[0..maxm,'a'..'c']of longint;

st:array[0..maxm]of char;

n,m,sum,len,i,j,flag:longint;

s:ansistring;

function max(a,b:longint):longint;

begin

if a>b then exit(a) else exit(b);

end;

procedure build(st:ansistring;time:longint);

var i,head,tail,flag,x:longint;

ch:char;

begin

x:=0;

for i:=1 to len do

begin

if trie[x,st[i]]=0 then

begin

inc(sum);

trie[x,st[i]]:=sum;

x:=sum;

ans[x]:=max(ans[x],time-last[x]-1);

last[x]:=time;

continue;

end;

x:=trie[x,st[i]];

ans[x]:=max(time-last[x]-1,ans[x]);

last[x]:=time;

end;

end;

procedure init;

var i,j,sum:longint;

s:ansistring;

begin

readln(n,m);

for i:=1 to n do

begin

readln(s);

len:=length(s);

build(s,i);

end;

end;

function find(st:ansistring):longint;

var x,i:longint;

begin

x:=0;

for i:=1 to len do

begin

if trie[x,st[i]]=0 then exit(n);

x:=trie[x,st[i]];

end;

exit(max(ans[x],n-last[x]));

end;

begin

assign(input,inf);reset(input);

assign(output,ouf);rewrite(output);

init;

for i:=1 to m do

begin

readln(s);

len:=length(s);

writeln(find(s));

end;

close(input);close(output);

end.

pyhton複習 字典

建立字典和訪問字典元素 建立乙個字典 dict 訪問字典內的元素 print 姓名 dict name print 年齡 dict age key,value 鍵,值 鍵必須是唯一的,但值則不必 刪除 清空字典 刪除字典元素 清空整個字典 dict clear print 姓名 dict name ...

NOIP2018複習 A(樹形DP)

時間限制 1000ms記憶體限制 256000kb 題目描述 lyh童鞋的手辦非常多,以至於他專門種了一棵樹來放置手辦 為了展現自己的收藏lyh決定從收藏樹上選取一些手辦展示 已知lyh的每個手辦都有不同的美麗值,第i個節點上有乙個美麗值為ai的手辦。lyh認為一種選取手辦的方案是合法的當且僅當選出...

python快速複習(字典,)

6.字典 6字典6.1 字典使用 字典就是一些列鍵值對,每個鍵都與乙個值相關聯。可以用鍵laif來訪問預置xian相關聯的值。與鍵xian相關聯的值可以是數字 字串 列表乃至字典。shis事實上可以將任何python物件用作字典中的值。在python中字典用放在 中的一系列鍵 值對來表示,如前面所示...