分析
哈希+统计
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int p=313,mod=1000007;
int n,m,r,a[1001],b[100001],v[2000001],u[2000001],lv[2000001],maxn,num,ans=2147483647;
string x;
int hash(string s)
{
int cnt=0;
for(int i=0;i<=s.length()-1;i++)
{
cnt=(cnt*p+s[i])%mod;
}
return cnt;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
a[i]=hash(x);
v[a[i]]=1;
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>x;
b[i]=hash(x);
if(v[b[i]]&&!u[b[i]])
{
maxn++;
u[b[i]]=1;
}
}
if(maxn==0)
{
cout<<0<<endl<<0;
return 0;
}
else cout<<maxn<<endl;
r=0;
for(int l=1;l<=m;l++)
{
while(num<maxn&&r<m)
{
r++;
if(v[b[r]])
{
if(lv[b[r]]==0) num++;
lv[b[r]]++;
}
}
if(num==maxn)
{
while(!v[b[l]]) l++;
ans=min(ans,r-l+1);
if(lv[b[l]]>=1)
{
if(lv[b[l]]==1) num--;
lv[b[l]]--;
}
}
}
cout<<ans;
return 0;
}