CodeVS3013 單詞背誦

2021-07-04 12:51:54 字數 2508 閱讀 8419

靈夢有n個單詞想要背,但她想通過一篇文章中的一段來記住這些單詞。

文章由m個單詞構成,她想在文章中找出連續的一段,其中包含最多的她想要背的單詞(重複的只算乙個)。並且在背誦的單詞量盡量多的情況下,還要使選出的文章段落盡量短,這樣她就可以用盡量短的時間學習盡可能多的單詞了。。

第1行乙個數n,

接下來n行每行是乙個長度不超過10的字串,表示乙個要背的單詞。

接著是乙個數m,

然後是m行長度不超過10的字串,每個表示文章中的乙個單詞。

輸出檔案共2行。第1行為文章中最多包含的要背的單詞數,第2行表示在文章中包含最多要背單詞的最短的連續段的長度。

3

hotdog

milk

5hot

dogdog

milk

hot

3

3

對於30%的資料 n<=50,m<=500;

對於60%的資料 n<=300,m<=5000;

對於100%的資料 n<=1000,m<=100000;

資料比較大,因此儲存最優方式是雜湊表。

判斷文章中單詞與雜湊表中相同的個數,就解決了第一問。

第二問的方式很久沒用這個思想,一時也沒想出來,看了別人題解,方法就是乙個l,乙個r記錄查詢範圍,範圍中至少最多包含的單詞每個都出現一次,根據這個思想就可以在o(

m)的時間內解決。

const mode=100007;

var n,m,ans,minl:longint;

p,num:array[0..mode] of longint;

table,used:array[0..mode] of boolean;

str:array[0..mode] of

string;

function

hash

(s:string):longint; //雜湊

var i,tmp:longint;

begin

tmp:=1; hash:=0;

for i:=1

to length(s) do

begin

hash:=(hash+ord(s[i])*tmp) mod mode;

tmp:=(tmp*31) mod mode;

end;

while (table[hash]) and (str[hash]<>s) do hash:=(hash+1) mod mode;

exit(hash);

end;

procedure

init;

//讀入要背的單詞

var s:string;

i:longint;

begin

readln(n);

for i:=1

to n do

begin

readln(s);

str[hash(s)]:=s;

table[hash(s)]:=true;

end;

end;

procedure

main;

var i,j,l,r,tot:longint;

s:string;

begin

readln(m); fillchar(used,sizeof(used),false);

for i:=1

to m do

begin

//讀入文章,處理最大值

readln(s);

p[i]:=hash(s);

if table[p[i]] and (not used[p[i]]) then

begin

inc(ans); used[p[i]]:=true;

end;

end;

writeln(ans);

//找到最短包含最大值的長度

l:=1; r:=1; tot:=0; minl:=maxlongint;

fillchar(num,sizeof(num),0);

while (r<=m) do

begin

while (r<=m) do

begin

if (used[p[r]]) and (num[p[r]]=0) then inc(tot);

inc(num[p[r]]);

inc(r);

if tot=ans then break;

end;

while ((not used[p[l]]) or (num[p[l]]>1)) and (ldo

begin

dec(num[p[l]]); inc(l);

end;

if r-lthen minl:=r-l;

end;

writeln(minl);

end;

begin

init;

main;

end.

CodeVS3013 單詞背誦

靈夢有n個單詞想要背,但她想通過一篇文章中的一段來記住這些單詞。文章由m個單詞構成,她想在文章中找出連續的一段,其中包含最多的她想要背的單詞 重複的只算乙個 並且在背誦的單詞量盡量多的情況下,還要使選出的文章段落盡量短,這樣她就可以用盡量短的時間學習盡可能多的單詞了。第1行乙個數n,接下來n行每行是...

CodeVS3013 單詞背誦 做題筆記

題目描述 description 靈夢有n個單詞想要背,但她想通過一篇文章中的一段來記住這些單詞。文章由m個單詞構成,她想在文章中找出連續的一段,其中包含最多的她想要背的單詞 重複的只算乙個 並且在背誦的單詞量盡量多的情況下,還要使選出的文章段落盡量短,這樣她就可以用盡量短的時間學習盡可能多的單詞了...

單詞背誦方法

關於方法 有人複習單詞,一開始就找本大部頭的書背。其結果,單詞沒背牢,反而時間過去大半。閱讀也因此受到限制。這裡介紹乙個方法。雖說不上是最科學的,但還是有一定的科學性。把複習單詞分為兩步 第一步,先記下單詞的大概。所謂大概是指,單詞的大概意思呀,大部分意項。第二步,找本好的單詞輔導書,乙個意思乙個意...