• P1381 单词背诵【双指针】


    P1381 单词背诵【双指针】
    题目描述
    灵梦有 n 个单词想要背,但她想通过一篇文章中的一段来记住这些单词。
    文章由 m 个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个)。并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了。
    输入格式
    第 1 行一个数 n,接下来 n 行每行是一个长度不超过 10 的字符串,表示一个要背的单词。
    接着是一个数 m,然后是 m 行长度不超过 10 的字符串,每个表示文章中的一个单词。
    输出格式
    输出文件共 2 行。第 1 行为文章中最多包含的要背的单词数,第 2 行表示在文章中包含最多要背单词的最短的连续段的长度。
    输入输出样例
    输入 #1
    3
    hot
    dog
    milk
    5
    hot
    dog
    dog
    milk
    hot
    输出 #1
    3
    3
    输入 #2
    3
    hot
    dog
    milk
    6
    hot
    car
    dog
    milk
    hot
    car
    输出 #2
    3
    3
    说明/提示
    数据规模与约定
    对于 30% 的数据,n≤50,m≤500;
    对于 60% 的数据,n≤300,m≤5000;
    对于 100% 的数据,n≤1000,m≤10^5 。

    以下使用双指针(尺取法)的解题思路:
    变量及数组功能:

    1. s[]记录文章中的单词
    2. word[]记录单词表中的单词
    3. cnt[]记录文章当前区间内目标单词的出现次数sum 记录文章中出现的目标单词个数
    4. len 记录包含目标单词最多的区间的最短长度

    算法操作过程:
    i指针指向当前区间的左端,j指针指向当前区间的右端。
    1.如果新来的单词 s[j]是目标单词,cnt[s[i]]++;
    2.if(cnt[s[j]]==1)sum++,len=j-i+1;
    3.while(i<=j):
            if(cnt[s[i]]==1)break;//保持i指针位置不动
            if(cnt[s[i]]>=2)cnt[s[i]]--,i++;//去重,更优
            if(!word[s[i]])i++;//去掉非目标单词,更优
    4.更新最短长度 len;

    1. #include
    2. using namespace std;
    3. const int N=1e5;
    4. int n,m,len,sum;
    5. string s[N+5],ss;
    6. mapbool> word;
    7. mapint> cnt;
    8. int main()
    9. {
    10. cin>>n;
    11. for(int i=1;i<=n;i++){
    12. cin>>ss;word[ss]=1;
    13. }
    14. cin>>m;
    15. for(int i=1,j=1;j<=m;j++){
    16. cin>>s[j];
    17. if(word[s[j]])cnt[s[j]]++;
    18. if (cnt[s[j]]==1){
    19. sum++;
    20. len=j-i+1;
    21. }
    22. while(i<=j){
    23. if(cnt[s[i]]==1) break;
    24. if(cnt[s[i]]>=2){
    25. cnt[s[i]]--;i++;
    26. }
    27. if(!word[s[i]])i++;
    28. }
    29. len=min(len,j-i+1);
    30. }
    31. cout<
    32. cout<
    33. return 0;
    34. }
  • 相关阅读:
    一文带你了解SpringMVC框架的基本使用
    web网页设计期末课程大作业 HTML+CSS+JavaScript 美食餐饮文化主题网站设计 学生DW静态网页设计
    TorchServe搭建codeBERT分类模型服务
    一款php开发的非常好的OA办公管理系统源码
    LVS负载均衡群集
    一次因没有找到iframe元素而怀疑selenium4是不是有问题?
    Python编辑器的选择配置和使用
    Python接入企业微信 - 推送信息到内部群里
    实例删除后volume仍然为in-use解决方法
    Java多线程之线程同步(解决线程安全问题)
  • 原文地址:https://blog.csdn.net/lybc2019/article/details/133242827