[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 字符

每个测试点时限2秒

这好像是个trie树的题目,但是蒟蒻的我已经忘了,但仔细想一想其实不用trie树,只用map,vector就可以了!
对于输入按照string型输入,因为我并不会用map套vector,所以我对于每个单词映射成一个数字,每当一行出现该单词时就将该行存入该vector下,在查询时就查询该单词映射下数字的vector中存储的所有数字,同时因为一行可能同时出现多次一个单词所以需要进行判重。

代码:


#include<iostream>
#include<cstdio>
#include<map>
#include<vector>
#include<cstring>
using namespace std;
int n,m,cnt;
int flag[500000];
map<string,int>match;
vector<int>G[100010]; 
int main(){
    cin >> n;
    for(int i = 1; i<=n; i++){
        int opt ;
        cin >> opt ;
        for(int j = 1; j<=opt; j++){
            string op;
            cin >> op;
            if(!match[op]){
                cnt++;
                match[op] = cnt;//映射成数字
                G[cnt].push_back(i);
            }
            else {
               G[match[op]].push_back(i); 
            }
        }
    } 
    cin >> m;
    for(int i = 1; i<=m; i++){
        string opt;
        cin >> opt;
        memset(flag,0,sizeof(flag));
        for(int j = 0; j<G[match[opt]].size(); j ++){
            if(flag[G[match[opt]][j]])continue;//判重
            flag[G[match[opt]][j]] = 1;
            cout << G[match[opt]][j] << ' ';
        }
        cout <<'\n';
    }
    
    
    return 0;
}  

猜你喜欢

转载自www.cnblogs.com/Euplectella/p/10092940.html