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 ...
随机推荐
- Unity 获得视频的某一帧,生成缩略图
Unity 并无直接获取视频某一帧图像的API,所以想要生成缩略图就要自己写方法了, 图片和视频都可以用这种方式生成缩略图,另,转载请标明出处,谢谢. using System.Collections ...
- [Python] Generating random numbers using numpy lib
import numpy as np def test_run(): data=np.random.random((3,4)) """ [[ 0.80150549 0.9 ...
- Ural 1303 Minimal Coverage(贪心)
题目地址:Ural 1303 先按每一个线段的左端点排序,然后设置一个起点s.每次都从起点小于等于s的线段中找到一个右端点最大的. 并将该右端点作为新的起点s,然后继续找. 从左到右扫描一遍就可以. ...
- Mahout-HashMap的进化版FastByIdMap
FastByIdMap是基于散列的.在处理冲突时是线性探測而非分离链接,这样就不必为每个条目添加一个Map.Entry对象.从而节省内存开销. 以下代码是一个线性探測Map的Demo: package ...
- modSecurity规则学习(四)——规则指令编写
规则语言是使用9个指令实现: 语法:SecRule VARIABLES OPERATOR [TRANSFORMATION_FUNCTIONS, ACTIONS] Variables 以下几种: Reg ...
- MySQL Server 5.5.44免安装版配置详解
转载地址:http://wenku.baidu.com/view/2a8bfe6a25c52cc58bd6beff.html### 一 下载MySQL http://dev.mysql.com/dow ...
- Linq中where查询
Linq的Where操作包括3种形式:简单形式.关系条件形式.First()形式. 1.简单形式: 例:使用where查询在北京的客户 var q = from c in db.Customers ...
- UltraEdit Companion Utility
UltraEdit Companion Utility 配色组件 http://www.danielwmoore.com/extras/index.php?action=downloads;sa=vi ...
- Zabbix钉钉小机器人报警
1.下载钉钉所需要的脚本golang-zabbix-robot-64,浏览器访问https://www.appgao.com/files/192.html: 图一 脚本下载 2.将脚本路径添加到 ...
- Django_高级扩展