1381 单词背诵
首先我本来想拿一个部分分60,可以不适用hash,用桶来进行骗分
结果我发现,我错了,这道题真的不太简单
首先我们先来说说题意:
意思就是说先输入一些单词,然后再输入一些单词,在m个单词中需要找到一连串单词,必须包含我要背的最多的,还得是长度最短的,其实这道题已经暗示我们用hash了
这道题难理解,我看了好长时间才做出来
这道题的思想就是每次输入文章单词的时候对它判断需不需要背然后统计出现次数,统计完就将答案1加一意思就是背的单词数加一,然后就是计算长度,计算长度需要将当前长度i减去l+1来获取,l表示的是不用背的个数,那么我们怕暖这个位置是不是重复过了,重复过了那么没背的次数就加一,然后每次答案获取最小值,最后输出
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
using namespace std;
map<string,int>sum;//记录出现次数
map<string,bool>flag;//用来标记
int ans1,ans2,n,m,l;
string s[100005],s1;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>s1,flag[s1]=1;//标记单词想背
cin>>m;l=1;//代表不用背的数量
for(int i=1;i<=m;i++)
{
cin>>s[i];
if(flag[s[i]])sum[s[i]]++;//记录单词出现次数
if(sum[s[i]]==1)ans1++,ans2=i-l+1;//需要背的次数和连续单词数
while(l<=i)//计算不用背的单词数
{
if(!flag[s[l]])
{
l++;
continue;
}//记录不用背的个数
if(sum[s[l]]>=2)
{
sum[s[l]]--,l++;
continue;
}//重复出现不算
break;
}
ans2=min(ans2,i-l+1);//记录要背的长度
}
cout<<ans1<<endl<<ans2<<endl;
return 0;
}