靈夢有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個單詞構成,她想在文章中找出連續的一段,其中包含最多的她想要背的單詞 重複的只算乙個 並且在背誦的單詞量盡量多的情況下,還要使選出的文章段落盡量短,這樣她就可以用盡量短的時間學習盡可能多的單詞了...
單詞背誦方法
關於方法 有人複習單詞,一開始就找本大部頭的書背。其結果,單詞沒背牢,反而時間過去大半。閱讀也因此受到限制。這裡介紹乙個方法。雖說不上是最科學的,但還是有一定的科學性。把複習單詞分為兩步 第一步,先記下單詞的大概。所謂大概是指,單詞的大概意思呀,大部分意項。第二步,找本好的單詞輔導書,乙個意思乙個意...