题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4917

题意:每一个单词都一些tips单词。

先输入n个单词和他们的tips。然后m组查询,每次查询一些单词。按字典序输出这些单词的公有tips。(每一个单词都都仅仅包括小写大写字母)

思路:对第i个单词。用vector数组g,g[i]来存这个单词的全部tips。对于全部单词建立字典树。在单词的结尾结点存好该单词的tips在g数组中存的一维下标i。最后用map来计数每组询问中每一个tips。每组询问中,对于全部的查询单词中全部的tips计数值等于单词个数的进行记录,终于按字典序排序,最后输出。

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <vector> using namespace std; const int N = 3e3 + 10;
const int SIZE = 60;
const int MAX_WORD = 305; struct Trie {
int val[SIZE];
int w;
}; int sz;
char str[MAX_WORD];
char st[MAX_WORD];
Trie pn[N];
map<string, int> m;
vector<string> g[N];
vector<string> res; int newnode() {
memset(pn[sz].val, 0, sizeof(pn[sz].val));
pn[sz].w = -1;
return sz++;
} void init() {
sz = 0;
newnode();
} void insert(char *s, int j) {
int u = 0;
int len = strlen(s);
for (int i = 0; i < len; i++) {
int idx = s[i] - 'A';
if (!pn[u].val[idx])
pn[u].val[idx] = newnode();
u = pn[u].val[idx];
}
pn[u].w = j;
string t;
gets(str);
len = strlen(str);
for (int i = 0; i < len; i++) {
if (str[i] == ' ') {
g[j].push_back(t);
t.clear();
}
else
t.push_back(str[i]);
}
if (!t.empty())
g[j].push_back(t);
} int findstr(char *s) {
int u = 0;
int len = strlen(s);
for (int i = 0; i < len; i++) {
int idx = s[i] - 'A';
if (!pn[u].val[idx])
return -1;
u = pn[u].val[idx];
}
if (g[pn[u].w].empty())
return -1;
for (int i = 0; i < g[pn[u].w].size(); i++)
m[g[pn[u].w][i]]++;
return u;
} int main() {
int n, q;
while (scanf("%d", &n) != EOF) {
init();
for (int i = 0; i < n; i++) {
scanf("%s", str);
getchar();
g[i].clear();
insert(str, i);
}
scanf("%d", &q);
getchar();
int k, t;
for (int i_q = 1; i_q <= q; i_q++) {
m.clear();
gets(str);
int y = 0;
t = 0;
int len = strlen(str);
for (int i = 0; i < len; i++) {
st[y++] = str[i];
if (str[i + 1] == '\0' || str[i + 1] == ' ') {
st[y] = '\0';
k = findstr(st);
if (k == -1)
break;
t++;
y = 0;
i++;
}
}
if (k == -1) {
puts("NO");
continue;
}
res.clear();
for (int i = 0; i < g[pn[k].w].size(); i++)
if (m[g[pn[k].w][i]] == t)
res.push_back(g[pn[k].w][i]);
if (res.empty())
puts("NO");
else {
sort(res.begin(), res.end());
for (int i = 0; i < res.size() - 1; i++)
cout << res[i] << " ";
cout << res[res.size() - 1] << endl;
}
}
}
return 0;
}

最新文章

  1. linux常用命令-帮助命令man,whatis,apropos,info,help
  2. 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等
  3. 64位centos下安装python的PIL模块
  4. NoSQL数据库的分布式模型
  5. linux下使用crontab定时备份MYSQL数据库的方法:
  6. 12_复杂查询01_Mapper代理实现
  7. Plugin &#39;FEDERATED&#39; is disabled 或 1067错误 启动错误与“服务 mysql 意外停止”解决方法
  8. 为什么每个浏览器都有Mozilla
  9. &quot;System.Web&quot; 中不存在类型或命名空间
  10. [转]取代cookie的网站追踪技术:”帆布指纹识别”初探
  11. 腾讯IVWEB团队:前端 fetch 通信
  12. Python爬虫——爬豆瓣登录页面
  13. ABP文档笔记 - 配置、设置、版本、功能、权限
  14. spring多模块项目手动整合
  15. 利用ZYNQ SOC快速打开算法验证通路(1)——MATLAB浮点数与定点二进制补码互转
  16. python设计模式---创建型之工厂模式
  17. mysql插入中文报错的问题
  18. Sql分页代码示例
  19. JAVA二分搜索树
  20. JAVA课程课后作业之使用递归完成回文

热门文章

  1. python 基础使用list、dict、set、可变与不可变对象
  2. docker容器存放目录磁盘空间满了,转移数据修改Docker默认存储位置
  3. WHU 1540 Fibonacci 递推
  4. 第二十四天 框架之痛-Spring MVC(四)
  5. 6.控制器(ng-Controller)
  6. spring之DelegatingFilterProxy
  7. React开发实时聊天招聘工具 -第五章 需求分析
  8. swift 编译提前定义 --不知道怎么定义,可是能够#if
  9. Levmar:Levenberg-Marquardt非线性最小二乘算法
  10. Apache shiro 笔记整理之web整合一