题解 P1381 【单词背诵】

· · 题解

思路

很明显,这就是一道 HASH,在这里我们使用 map + string,代码难度就大大下降了。

我们每次记录此时有多少个单词,若比之前多,则直接更新长度与数量。

然后在更新左边 l,若最左边的单词不想背,或后文已出现就更新,把长度去最短即可。

时间

## 最短代码 ```cpp #include<bits/stdc++.h> 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; } ``` 如果有帮到你,请点赞支持,谢谢。