zoukankan      html  css  js  c++  java
  • P3879 [TJOI2010]阅读理解 题解

    P3879 [TJOI2010]阅读理解 题解

    题目描述

    英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过。

    输入输出格式

    输入格式:

    第一行为整数N,表示短文篇数,其中每篇短文只含空格和小写字母。

    按下来的N行,每行描述一篇短文。每行的开头是一个整数L,表示这篇短文由L个单词组成。接下来是L个单词,单词之间用一个空格分隔。

    然后为一个整数M,表示要做几次询问。后面有M行,每行表示一个要统计的生词。

    输出格式:

    对于每个生词输出一行,统计其在哪几篇短文中出现过,并按从小到大输出短文的序号,序号不应有重复,序号之间用一个空格隔开(注意第一个序号的前面和最后一个序号的后面不应有空格)。如果该单词一直没出现过,则输出一个空行。

    输入输出样例

    输入样例#1:

    3
    9 you are a good boy ha ha o yeah
    13 o my god you like bleach naruto one piece and so do i
    11 but i do not think you will get all the points
    5
    you
    i
    o
    all
    naruto
    

    输出样例#1:

    1 2 3
    2 3
    1 2
    3
    2
    

    说明

    对于30%的数据,1 ≤ M ≤ 1,000

    对于100%的数据,1 ≤ M ≤ 10,000,1 ≤ N ≤ 1000

    每篇短文长度(含相邻单词之间的空格) ≤ 5,000 字符,每个单词长度 ≤ 20 字符

    思路:

    这个题的数据更新了呢。所以下面所有关于tire的题解都过不了了。不过把tire讲的很详细。所以我就不多讲了。

    想练习tire的我被卡的一愣愣的qaq。数组开的小了是WA#11.开成1000就是前面十个点随机MLE。

    具体怎么用tire过这个题就是把标记出现的bool数组改成bitset,节省32倍空间,你,值得拥有。

    就是别忘了写bitset的专用头文件。定义一个bitset后当二维数组用就好啦。

    最后再丢一个博客
    qwq

    这里有bitset的详细用法,想学的同学了解一下。


    最后是代码,除了bitset,就是普通的tire啦。

    (Code)

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include <bitset>
    
    using namespace std;
    
    int n,m;
    char s[1001];
    int l;
    int tot=0;
    int tri[300007][26];
    bitset<1001> b[500007];
    
    
    inline void insert(char *s,int x){
        int rt=0;
        for(int i=0;s[i];i++){
            int v=s[i]-'a';
            if(!tri[rt][v]){
                tri[rt][v]=++tot;
            }
            rt=tri[rt][v];
        }
        b[rt][x]=1;
    }
    
    inline void query(char *s){
        int rt=0;
        for(int i=0;s[i];i++){
            int v=s[i]-'a';
            if(!tri[rt][v]){
                cout<<' '<<endl;
                return;
            }
            rt=tri[rt][v];
        }
        for(int i=1;i<=n;i++){
            if(b[rt][i]==1){
                cout<<i<<' ';
            }
        }
        cout<<endl;
    }
    
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>l;
            for(int j=1;j<=l;j++){
                cin>>s;
                insert(s,i);
            }
        }
        cin>>m;
        for(int i=1;i<=m;i++){
            cin>>s;
            query(s);
        }
        return 0;
    }
    
  • 相关阅读:
    从苦逼到牛逼,详解Linux运维工程师的打怪升级之路
    Linux命令学习
    Linux企业运维人员最常用150个命令汇总
    理解Docker
    理解Docker(8):Docker 存储之卷(Volume)
    理解Docker(7):Docker 存储
    理解Docker(6):若干企业生产环境中的容器网络方案
    理解Docker(5):Docker 网络
    理解Docker(4):Docker 容器使用 cgroups 限制资源使用
    理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境
  • 原文地址:https://www.cnblogs.com/enceladus-return0/p/9879109.html
Copyright © 2011-2022 走看看