题目链接: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. 【模板】2-SAT 问题(2-SAT)

    [模板]2-SAT 问题 题目背景 2-SAT 问题 模板 题目描述 有n个布尔变量 \(x_1\)​ ~ \(x_n\)​ ,另有m个需要满足的条件,每个条件的形式都是" \(x_i\) ...

  2. C语言调试小技巧

    经常看到有人介绍一些IDE或者像gdb这样的调试器的很高级的调试功能,也听人说过有些牛人做工程的时候就用printf来调试,不用特殊的调试器.特别是在代码经过编译器一些比较复杂的优化后,会变得“难以辨 ...

  3. ArcGIS api for javascript——设置自定义范围和空间参考

    描述 这个示例展示了在创建地图时如果定义一个自定义的范围和空间参考. 在 ArcGIS JavaScript API的1.0和1.1版本,任何要使用的地图服务图层都需要和地图的空间参考一致.1.2版本 ...

  4. KM最大匹配 HDU 2255

    KM算法详解+模板 - wenr - 博客园  http://www.cnblogs.com/wenruo/p/5264235.html #include<iostream> #inclu ...

  5. web前端开发——AJAX入门

    什么是AJAX AJAX: A New Approach to Web Applications XML AJAX是老技术新思想. 它所包括的内容我们之前都接触过.例如以下: (1)使用XHTML和C ...

  6. (WPF)XAML 过程式代码

    当代码编译.x:Code 元素的内容将被放到.g.cs文件. <Window x:Class="WpfApplication7.MainWindow" xmlns=" ...

  7. dubbo+zookeeper+springMVC +maven

    pom:                    <dependency>             <groupId>com.github.sgroschupf</grou ...

  8. mybatis集成到spring理解

  9. C# Arcgis Engine 获得鼠标按下位置的要素

    public IFeature GetFeatureOnMouseDown(IPoint point) { try { ILayer layer = Common.GetLayerByName(mMa ...

  10. ThinkPHP数据分页Page.class.php

    获取分页类 ThinkPHP提供了数据分页的扩展类库Page,能够在http://www.thinkphp.cn/extend/241.html下载,或者下载官方的完整扩展包(http://www.t ...