問題の説明
霊夢n個の言葉はあなたが戻って持つようにしたいが、彼女は1品の期間でこれらの単語を覚えたいです。
記事は、彼女は彼女が(唯一の一つとして数え繰り返し)バックたかった単語を含むほとんどが、記事の連続期間を見つけたい、m個の単語で構成されています。そして、状況の限り数量ワード朗読ではなく、記事できるだけ短く選出された段落にするために、彼女は言葉できるだけ多くを学ぶために最短時間を使用することができます。
入力形式
最初の行数n、次のn行の各列は、バックワードを表すために、もはや10以下です。
数m、続いて、10 M線文字列の長さは、各記事の単語を表す、超えていません。
出力フォーマット
総出力ファイル2行。2番目の行に含まれる記事の最初の行為にバックアップしたい単語の数は、バック物品における最短の連続的なセグメントに単語を表現するために最大の長さを含んでいます。
サンプル入力
3
hot
dog
milk
5
hot
dog
dog
milk
hot
サンプル出力
3
3
ヒント
nのデータの30%<= 50、M <= 500。
nのデータの60%<= 300、M <= 5000。
データの100%にN <= 1000、M <= 100000。
制限時間:1秒
スペースの制約:128メガバイト
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <cmath> の#include <CStringの> する#include <地図> 使用して 名前空間STD。 符号なしのtypedef 長い 長いULL。 マップ <ULL、int型 > VIS、地図。 マップ < int型、ULL> B; チャー [ 12 ]。 int型 GETHASH(ストリングS) { int型 LEN = s.length()。 ULL和(0 )。 以下のための(int型、I = 0を私は++; iがLEN <; ) 合計 =合計* 131 + S [I] - [ A ' 。 戻り値の合計。 } int型のmain() { // freopenは( "p386.in"、 "R"、STDIN)。 // freopenは( "p386.out"、 "W"、STDOUT)。 INTの N、M、和= 0 。 cinを >> N; 以下のために(int型 i = 1 ; iが++; iが<= N ) { scanf関数(" %sの" 、A)。; } のscanf(" %dの"、&M)。 以下のために(int型 I = 1 ; I <= M; iは++ ) { scanf関数(" %sの" 、A)。 B [i]は = GETHASH(A)。 もし(マップ[B [I]] &&!VIS [B [I]]) { 合計 ++ ; VIS [i]と[B] = 1 。 } } のprintf(" %d個の\ n " 、合計)。 vis.clear(); int型リットル=0、R = 1、ANS(1 << 30)、SUMX = 0 。 一方、(R <= M) { ながら(R <= M) { 場合(VIS [B [R]] &&マップ[B [R]]!)SUMX ++ 。 VIS [R] [B] ++ ; R ++ ; もし(SUMX ==合計)ブレーク。 } 一方、(L <R &&(地図|| VIS [L] B] [] L [B]!> 1 )) { VIS [L] [B] - 。 L ++ ; } 年間 =分(年R- L)。 } のprintf(" %dの" 、年)。 リターン 0 ; }