//Codevs3013 單詞背誦
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
const int maxn=1000+10,maxm=100000+10,INF=maxm;
int n,m,ans1=0,ans2=INF;
char c[20];
bool vis[maxn];
int essay[maxm],tot[maxn],e=0;
map<long long,int> D;
map<long long,int> :: iterator it;
long long num1,num2;
void init1() {
num1=0;num2=1;
for(int i=strlen(c)-1;i>=0;--i) {
num1+=(c[i]-'a'+1)*num2;
num2=num2*26;
}
if(D.find(num1)==D.end())
D.insert(pair<long long,int>(num1,++e));
}
int x;
void init2(int pos) {
num1=0;num2=1;
for(int i=strlen(c)-1;i>=0;--i) {
num1+=(c[i]-'a'+1)*num2;
num2=num2*26;
}
it=D.find(num1);
if(it!=D.end()) {
x=it->second;
if(vis[x]==0) ans1++;
vis[x]=1;essay[pos]=x;
}
else essay[pos]=-1;
}
void doit() {
int sum=0,j=0;
for(int i=1;i<=m;++i) {
if(i>1) {
if(tot[essay[i-1]]==1) sum--;
tot[essay[i-1]]--;
}
if(sum>=ans1) {
ans2=min(ans2,j-i+1);
continue;
}
for(j=j+1;j<=m;++j) {
if(essay[j]==-1) continue;
tot[essay[j]]++;
if(tot[essay[j]]==1) {
sum++;
if(sum>=ans1) {
ans2=min(ans2,j-i+1);
break;
}
}
}
}
cout<<ans2;
}
int main() {
scanf("%d",&n);gets(c);
for(int i=1;i<=n;++i) {
gets(c);init1();
}
scanf("%d",&m);gets(c);
for(int i=1;i<=m;++i) {
gets(c);init2(i);
}
cout<<ans1<<"\n";
if(ans1>1) doit();
else cout<<ans1;
return 0;
}
Codevs1013 單詞背誦
不知道哪根筋抽了,用map寫Hash,long long就可以滿足Hash了,開心!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.