题目链接: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;
}

ZOJ 3674 Search in the Wiki(字典树 + map + vector)的更多相关文章

  1. zoj 1109 zoj 1109 Language of FatMouse(字典树)

    好开心,手动自己按照字典树的思想用c写了一个优化后的trie字典树,就是用链表来代替26个大小的字符数组.完全按照自己按照自己的想法打的,没有参考如何被人的代码.调试了一天,居然最后错在一个小问题上, ...

  2. I: Carryon的字符串排序(字典树/map映射)

    2297: Carryon的字符串 Time Limit: C/C++ 1 s      Java/Python 3 s      Memory Limit: 128 MB      Accepted ...

  3. POJ 1002 487-3279(字典树/map映射)

    487-3279 Time Limit: 2000MS        Memory Limit: 65536K Total Submissions: 309257        Accepted: 5 ...

  4. poj1002 字典树+map+查询单词出现次数

    487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 309235   Accepted: 55223 Descr ...

  5. ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)

    Description We all use cell phone today. And we must be familiar with the intelligent English input ...

  6. HDU1251 统计难题(字典树|map

    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部分 ...

  7. hdoj 1251 字典树||map

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  8. 字典树+map

    Problem Description Carryon最近喜欢上了一些奇奇怪怪的字符,字符都是英文小写字母,但奇怪的是a可能比b小,也可能比b大,好奇怪.与此同时,他拿到了好多的字符串,可是看着很不顺 ...

  9. POJ 2503 Babelfish(map,字典树,快排+二分,hash)

    题意:先构造一个词典,然后输入外文单词,输出相应的英语单词. 这道题有4种方法可以做: 1.map 2.字典树 3.快排+二分 4.hash表 参考博客:[解题报告]POJ_2503 字典树,MAP ...

随机推荐

  1. Unity C# 设计模式(七)适配器模式

    定义: 将一个类的接口转换成客户希望的另一个接口.adapter模式使得原本由于接口不兼容而不能在一起的那些类可以一起工作. 示例代码: 1.类适配器 /* Class Adapter:类适配器,这里 ...

  2. 洛谷—— P1003 铺地毯

    https://www.luogu.org/problem/show?pid=1003 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形 ...

  3. 洛谷 P1056 排座椅

    P1056 排座椅 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上 ...

  4. 受不了Android SDK文档打开缓慢问题,自己开发简易脱机浏览器。

    google android sdk离线文档打开的时候特别慢,据说是要从谷歌官网拉取一些东西导致的.脱机浏览能够解决该问题.PC端能够使用firefox. 可是Android端貌似没有支持脱机工作的浏 ...

  5. iOS 实现QQ界面

    应师傅要求编写个QQ界面来不吝赐教下我的代码问题. 编写个QQ界面.有三个组,每一个组有人.并显示在线不在线. 先看一下效果图 这里省了事由于我的图片仅仅用了一张.假设要依据人的不同设置,仅仅要在ce ...

  6. json数据转化成实体 存到数据库.

    直接看步骤吧 1.一般我们会调用别人给的webservice获取一个字符串数据.如果为String data="xxxxxxxxxx";  这个data事实上就是样例Enterpr ...

  7. SpringMVC 常见异常处理

    1.javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"request" ...

  8. modSecurity规则学习(七)——防止SQL注入

    1.数字型SQL注入 /opt/waf/owasp-modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [lin ...

  9. 1.windows(64位)下使用curl命令

    转自:https://www.cnblogs.com/xing901022/p/4652624.html Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景 ...

  10. 关于checkbox的一些jquery操作

    表单在前端开发中是经常会遇到的,其中自然也少不了checkbox复选框,对于复选框的操作无外乎有以下三种:全选,全不选,反选.下面零度逍遥就给大家分析分析. 一.checkbox全选 大家都知道选择c ...