【题解】单词背诵

QUESTION_POS

本来想用\(trie\)的,结果有一个神奇的数组赋值无效……

思路:先求出第一问答案,可以\(O(n)\)一遍扫出来,注意背诵的单词只统计一次

难点在于第二问。

可以用单调队列扫一下,记录队列中每个单词在文章中的位置,对于队头,如果这里的单词在后面出现过,队头就可以不要了。

当队伍中单词达到数量时,可以统计答案了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<map>
using namespace std;
int head=1,tail,n,m,cnt,ans;
int tot,q[100010],a[100010];
int b[100010],vis[100010];
char ch[21];
map<string,int>mp;
const int inf=2147483647;
int main(){
    ans=inf;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%s",ch);
        mp[ch]=i;
    }
    scanf("%d",&m);
    for(int i=1;i<=m;++i){
        scanf("%s",ch);
        a[i]=mp[ch];
        if(!a[i])continue;
        if(!vis[a[i]]){
            vis[a[i]]=1;
            tot++;
        }//找出现过的所有单词
        //也可以用trie
    }
    if(!tot){//特判,因为tail-head最小是1,不特判WA一个点
        printf("0\n0");
        return 0;
    }
    for(int i=1;i<=m;++i){
        if(!b[a[i]]&&a[i])cnt++;
        b[a[i]]=i,q[++tail]=i;
        //b数组存的是当前要背单词在队列中最靠后的位置
        //q数组存的是当前队列中有的要背单词的文章中pos
        //如果当前队列里面有值并且当前队头的单词在后面出现过
        //可以去掉队头,指针后移
        //当队伍中已经包含所有单词时
        //更新答案
        while(head<=tail&&q[head]<b[a[q[head]]])head++;
        if(cnt==tot)ans=min(ans,tail-head+1);
    }
    printf("%d\n%d",tot,ans);
    return 0;
}

原文地址:https://www.cnblogs.com/h-lka/p/12179563.html

时间: 2024-11-06 17:07:03

【题解】单词背诵的相关文章

【luogu P1381单词背诵】题解

单词背诵 题目描述 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个).并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了. 输入格式 第1行一个数n, 接下来n行每行是一个长度不超过10的字符串,表示一个要背的单词. 接着是一个数m, 然后是m行长度不超过10的字符串,每个表示文章中的一个单词. 输出格式 输出文件共2行.第1行

[CODEVS3031] 单词背诵 - 字符串hash

3013 单词背诵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个).并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了. 输入描述 Input Description 第1行一个数n, 接下来n行每行是一个

基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0

作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/  感觉我要火~~这比我是装定了!! 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数据库.以及TTS文本识别语音单词朗读的一款软件. 第一款软件的sql数据库软件的编写:http://www.cnblogs.com/xiaobo-Linux/p/4676950.html 现在来讲解我的第二款高大上的代码: 这个是.pro的代码,其中axconta

单词背诵 500 个考过二十次以上词汇

单词背诵 500 个考过二十次以上词汇above / beyond:  介词,后面接抽象而不是具体名词时表示 “ 无法做到 ” ,例如: “above comprehension” 的意思是 “ 无法理解 ”. .in the absence of something: “ 缺少,没有 ” ,用于替代 “in short of” 或者 “be lacking in” .be absorbed in something: “ 专心从事 ” .abuse:  用在物品词后面表示 “ 过量使用 ” ,

【CodeVS3013】单词背诵

Description 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个).并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了. Input 第1行一个数n, 接下来n行每行是一个长度不超过10的字符串,表示一个要背的单词. 接着是一个数m, 然后是m行长度不超过10的字符串,每个表示文章中的一个单词. Output 输出文件共2

CODEVS——T 3013 单词背诵

http://codevs.cn/problem/3013/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个).并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了. 输入描述 Input

codevs 3013 单词背诵 hash

题目链接 题目描述 Description 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个).并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了. 输入描述 Input Description 第1行一个数n, 接下来n行每行是一个长度不超过10的字符串,表示一个要背的单词. 接着是一个数m, 然后是m行长度不超过10的字符串,

[codeVS1204] 单词背诵

题目描述 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个).并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了. 输入输出格式 输入格式: 第1行一个数n, 接下来n行每行是一个长度不超过10的字符串,表示一个要背的单词. 接着是一个数m, 然后是m行长度不超过10的字符串,每个表示文章中的一个单词. 输出格式: 输出文件共2行

单词背诵【CodeVS3013】 哈希

问题描述 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个).并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了. 输入格式 第1行一个数n,接下来n行每行是一个长度不超过10的字符串,表示一个要背的单词. 接着是一个数m,然后是m行长度不超过10的字符串,每个表示文章中的一个单词. 输出格式 输出文件共2行.第1行为文章中最多包