ZOJ 3674 Search in the Wiki(字典树 + map + vector)
题目链接: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)的更多相关文章
- zoj 1109 zoj 1109 Language of FatMouse(字典树)
好开心,手动自己按照字典树的思想用c写了一个优化后的trie字典树,就是用链表来代替26个大小的字符数组.完全按照自己按照自己的想法打的,没有参考如何被人的代码.调试了一天,居然最后错在一个小问题上, ...
- I: Carryon的字符串排序(字典树/map映射)
2297: Carryon的字符串 Time Limit: C/C++ 1 s Java/Python 3 s Memory Limit: 128 MB Accepted ...
- POJ 1002 487-3279(字典树/map映射)
487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 309257 Accepted: 5 ...
- poj1002 字典树+map+查询单词出现次数
487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 309235 Accepted: 55223 Descr ...
- ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)
Description We all use cell phone today. And we must be familiar with the intelligent English input ...
- HDU1251 统计难题(字典树|map
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部分 ...
- hdoj 1251 字典树||map
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- 字典树+map
Problem Description Carryon最近喜欢上了一些奇奇怪怪的字符,字符都是英文小写字母,但奇怪的是a可能比b小,也可能比b大,好奇怪.与此同时,他拿到了好多的字符串,可是看着很不顺 ...
- POJ 2503 Babelfish(map,字典树,快排+二分,hash)
题意:先构造一个词典,然后输入外文单词,输出相应的英语单词. 这道题有4种方法可以做: 1.map 2.字典树 3.快排+二分 4.hash表 参考博客:[解题报告]POJ_2503 字典树,MAP ...
随机推荐
- python-排序算法 冒泡和快速排序
交换排序 交换排序有冒泡排序和快速排序 冒泡排序 冒泡排序就是每次找出最大(最小)元素,放在集合最前或最后,这是最简单的排序算法 print("未排序之前:",collection ...
- [NOI2016]优秀的拆分(SA数组)
[NOI2016]优秀的拆分 题目描述 如果一个字符串可以被拆分为 \(AABB\) 的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 \(aabaaba ...
- 洛谷——P1019 单词接龙(NOIP2000 T3)
https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...
- zookeeper 性能测试
zookeeper压力测试:性能对比(3个节点,5个节点,7个节点 创建节点.删除节点.设置节点数据.读取节点数据性能及并发性能) 测试结果如下: 五次测试三节点结果: 创建100W节点用时:15.0 ...
- sql阻塞进程查询
select A.SPID as 被阻塞进程,a.CMD AS 正在执行的操作,b.spid AS 阻塞进程号,b.cmd AS 阻塞进程正在执行的操作 from master..sysprocess ...
- MessageFormat
MessageFormat mf = new MessageFormat("{0,number,#.##}, {0,number,#.#}"); Object[] objs = { ...
- 实现图片懒加载(lazyload)
对页面加载速度影响最大的就是图片,一张普通的图片可以达到几M的大小,而代码也许就只有几十KB.当页面图片很多时,页面的加载速度缓慢,几S钟内页面没有加载完成,也许会失去很多的用户. 所以,对于图片过多 ...
- Atcoder Grand Contest 107 A Biscuits
A - Biscuits Time limit : 2sec / Memory limit : 256MB Score : 200 points Problem Statement There are ...
- Python正则表达式的简单应用和示例演示
前一阵子小编给大家连续分享了十篇关于Python正则表达式基础的文章,感兴趣的小伙伴可以点击链接进去查看.今天小编给大家分享的是Python正则表达式的简单应用和示例演示,将前面学习的Python正则 ...
- jQuery中四种事件监听的区别
原文链接:点我 我们知道jquery提供了四种事件监听方式,分别是bind.live.delegate.on,下面就分别对这四种事件监听方式分析. 已知有4个列表元素: 列表元素1 列表元素2 列表元 ...