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;
}
posted @ 2018-10-30 19:55  enceladus  阅读(354)  评论(0编辑  收藏  举报

Contact with me