map+滑动窗口。注意变量加减的先后顺序。
#include<bits/stdc++.h>
using namespace std;
const int maxn=20;
const int maxm=1e5+10;
int n,m,ans1=0,ans2=(1<<30);
string mem,atc[maxm];
map<string,int> M;
map<string,int> vis;
map<string,int> v;
map<string,int> cnt;
inline int read(){
int x=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x;
}
int main(){
n=read();
for(int i=1;i<=n;++i) cin>>mem,M[mem]+=1;
m=read();
for(int i=1;i<=m;++i){
cin>>atc[i];
if(M.count(atc[i])&&(!vis[atc[i]])) ans1++,vis[atc[i]]=1;
}
int l=0,r=0,now=0;
while(l<=r){
while(r<m){
++r;
if(!vis[atc[r]]) continue;
cnt[atc[r]]++;
if(cnt[atc[r]]==1) now++;
if(now==ans1) break;
}
while(l<=r){
if(!vis[atc[l]]){l++;continue;}
if(cnt[atc[l]]>1){cnt[atc[l]]--;l++;}
if(cnt[atc[l]]==1){
break;
}
}
ans2=min(ans2,r-l+1);
if(r>=m) break;
}
cout<<ans1<<'\n'<<ans2<<'\n';
}