\(\color{#0066ff}{ 题目描述 }\)

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

\(\color{#0066ff}{输入格式}\)

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

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

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

\(\color{#0066ff}{输出格式}\)

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

\(\color{#0066ff}{输入样例}\)

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

\(\color{#0066ff}{输出样例}\)

1 2 3
2 3
1 2
3
2

\(\color{#0066ff}{数据范围与提示}\)

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

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

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

\(\color{#0066ff}{ 题解 }\)

对所有单词建立Trie树,每个点维护一个set,代表属于哪一行

匹配到的时候扫一遍set就行了

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
using std::set;
struct Trie {
protected:
struct node {
node *ch[26];
set<int> s;
node() {
memset(ch, 0, sizeof ch);
s.clear();
}
void *operator new (size_t) {
static node *S = NULL, *T = NULL;
return (S == T) && (T = (S = new node[1024]) + 1024), S++;
}
};
node *root;
public:
Trie() { root = new node(); }
void ins(char *s, int id) {
node *o = root;
for(char *p = s; *p; p++) {
int pos = *p - 'a';
if(!o->ch[pos]) o->ch[pos] = new node();
o = o->ch[pos];
}
o->s.insert(id);
}
void query(char *s) {
node *o = root;
for(char *p = s; *p; p++) {
int pos = *p - 'a';
if(o->ch[pos]) o = o->ch[pos];
else goto noans;
}
for(auto &k : o->s) printf("%d ", k);
noans:;
puts("");
}
}T;
char s[500];
int main() {
int n = in();
for(int i = 1; i <= n; i++) {
int k = in();
for(int j = 1; j <= k; j++) {
scanf("%s", s);
T.ins(s, i);
}
}
for(int m = in(); m --> 0;) {
scanf("%s", s);
T.query(s);
}
return 0;
}

最新文章

  1. MS14-064 漏洞测试入侵win7
  2. [转]二重积分换元法的一种简单证明 (ps:里面的符号有点小错误,理解就好。。。
  3. 第一个java程序hello world
  4. CSS选择器 使用小结
  5. 改成 否“依然报LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”问题的解决
  6. 用HTML5 Canvas 做擦除及扩散效果
  7. hightcharts在移动端运用 FastClick后苹果上legend点击失效的解决办法
  8. ORACLE数据库管理常用查询语句
  9. console.table(),在控制台以表格形式输出对象
  10. Android下获取FPS的几种方法
  11. #2019-2020-4 《Java 程序设计》第八周总结
  12. Javascript高级编程学习笔记(78)—— 表单(6)HTML约束验证API
  13. 神经网络架构pytorch-MSELoss损失函数
  14. GitHub-标签管理
  15. iOS数据存储-钥匙串存储
  16. ASM ClassReader failed to parse class file解决方法
  17. elasticsearch 安装,以及遇到的问题总结
  18. Mac 命令行,自定义命令
  19. C/C++常用预处理指令
  20. vmware workstation 下安装ubuntu

热门文章

  1. final,finally和finalize三者的区别和联系
  2. java集合类(2)
  3. php中的foreach改变数组的值的问题
  4. ios AppStore 帐号申请
  5. 《Android应用性能优化》 第5章 多线程和同步
  6. Strophe.Status的所有值
  7. elmah数据库sql脚本
  8. sublime3 There are no packages available for installation
  9. CDOJ1324-卿学姐与公主 【线段树点更新】
  10. 3、PACBIO下机数据如何看