POJ 1451 T9 (字典树好题)
背景:为了方便九宫格手机用户发短信,希望在用户按键时,根据提供的字典(给出字符串和频数),给出各个阶段最有可能要打的单词。
题意: 首先给出的是字典,每个单词有一个出现频率。然后给出的是询问,每个询问有一个数字字符串,代表在手机上按了哪些键,以1结束。问按键的过程中最可能出现的单词分别是哪些。
思路:搞了很久.......一开始总想着以字母为各结点如何建树,询问......还是太年轻了。
以手机8个键作为字典树各节点,每个结点映射3-4对应的字母。每个结点存频率最高的串,询问的时候也可以方便的直接询问了。
还是太年轻了.........理解题意为具有相同前缀的串的频率是高的覆盖低的........其实是叠加...........一直没看出来。
题目是按照字典序升序给出字典的,所以可以把相同的前缀频率相加,这样只是插入一次了。
接下来就是基本字典树的写法了
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; char book[] = {"22233344455566677778889999"}; //映射
char str[1111][111];
int cou[1111][111];
struct trie {
trie *next[12];
char word[105];
int num;
trie() {
num = 0;
memset(next,0,sizeof(next));
memset(word,0,sizeof(word));
}
}*root; void insert(char *key,int i) {
trie *p = root;
char tmp[105];
int ind = 0;
int j = 0;
while(key[j]) {
int t = book[key[j] - 'a'] - '0';
tmp[ind++] = key[j];
if(p->next[t] == NULL) {
p->next[t] = new trie();
}
p = p->next[t];
tmp[ind] = '\0';
if(p->num < cou[i][j]) {
p->num = cou[i][j];
strcpy(p->word,tmp);
}
j++;
}
} void query(char *key) {
trie *p = root;
int flag = 0;
while(*key) {
int t = *key - '0';
if(p->next[t] == NULL || flag) { //用flag标记一下,有可能会有前一个单词不存在,后面单词存在字典中,此时应该输出这个的
printf("MANUALLY\n");
key++;
flag = 1;
continue;
}
p = p->next[t];
printf("%s\n",p->word);
key ++;
}
} void free(trie *p) { //释放内存而已
for(int i=0; i<=9; i++) {
if(p->next[i] != NULL) free(p->next[i]);
}
delete p;
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("D:\\hehe.txt","w",stdout);
#endif
int T,cnt;
cin >> T;
int casee = 1;
while(T --) {
root = new trie();
int n,i;
scanf("%d",&n);
for(i=0; i<n; i++) {
scanf("%s%d",str[i],&cnt);
int len = strlen(str[i]);
for(int j=0; j<len; j++) {
cou[i][j] = cnt;
}
}
for(i=1; i<n; i++) //相同前缀频率相加,堆在一起算
for(int j=0; str[i][j] && str[i - 1][j]; j++) {
if(str[i][j] == str[i-1][j]) {
cou[i][j] += cou[i-1][j];
cou[i-1][j] = 0;
}
else break;
}
for(i=0; i<n; i++) {
insert(str[i],i);
}
printf("Scenario #%d:\n",casee ++);
int m;
scanf("%d",&m);
char str1[111],st[111];
for(i=0; i<m; i++) {
scanf("%s",st);
int len = strlen(st);
strncpy(str1,st,len-1);
str1[len-1] = '\0';
query(str1);
puts("");
}
puts("");
free(root);
}
return 0;
}
POJ 1451 T9 (字典树好题)的更多相关文章
- POJ 1451 - T9 - [字典树]
题目链接:http://bailian.openjudge.cn/practice/1451/ 总时间限制: 1000ms 内存限制: 65536kB 描述 Background A while ag ...
- 字典树模板题(统计难题 HDU - 1251)
https://vjudge.net/problem/HDU-1251 标准的字典树模板题: 也注意一下输入方法: #include<iostream> #include<cstdi ...
- CH 1601 - 前缀统计 - [字典树模板题]
题目链接:传送门 描述给定 $N$ 个字符串 $S_1,S_2,\cdots,S_N$,接下来进行 $M$ 次询问,每次询问给定一个字符串 $T$,求 $S_1 \sim S_N$ 中有多少个字符串是 ...
- HDU 1251 统计难题(字典树模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:给出一些单词,然后有多次询问,每次输出以该单词为前缀的单词的数量. 思路: 字典树入门题. #inc ...
- hdu1305 字典树水题
题意: 给你一些字符串,然后问你他们中有没有一个串是另一个串的前缀. 思路: 字典树水题,(这种水题如果数据不大(这个题目不知道大不大,题目没说估计不大),hash下也行,把每个 ...
- hdu 1251 统计难题 (字典树入门题)
/******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...
- POJ 1451 T9
T9 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3083 Accepted: 1101 Description Ba ...
- HDU1251 字典树板子题
题意:中文题,统计以某字符串作为前缀的字符串个数 刚学字典树,理解起来十分简单,就是维护一个多叉树,这里用的是链表版本,后面就用的是数组版本了,个人更喜欢数组版本,这里的链表版本就因为 莫名其妙的错误 ...
- hdu 1251 统计难题 字典树第一题。
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
随机推荐
- ssh端口转发(之kettle ssh方式连接数据库)
ssh参数解释 格式 ssh [user@]host [command] 选项: -1:强制使用ssh协议版本1: -2:强制使用ssh协议版本2: -4:强制使用IPv4地址: -6:强制使用IP ...
- SQL Server密码爆破工具SQLdict
SQL Server密码爆破工具SQLdict SQL Server是Windows系统常用的数据库服务器.它广泛采用用户名和密码方式,进行身份认证.Kali Linux提供一款专用的数据库密码爆破工 ...
- Xamarin iOS教程之使用按钮接接收用户输入
Xamarin iOS教程之使用按钮接接收用户输入 Xamarin iOS使用按钮接接收用户输入 按钮是用户交互的最基础控件.即使是在iPhone或者iPad中,用户使用最多操作也是通过触摸实现点击. ...
- Xamarin iOS教程之申请付费开发者账号下载证书
Xamarin iOS教程之申请付费开发者账号下载证书 Xamarin iOS使用真机测试应用程序 在讲解iOS Simulator时,已经提到了虽然iOS Simulator可以模仿真实的设备,但是 ...
- SlickOne 敏捷开发框架介绍(二) -- 多用户/多租户/SAAS软件基础框架实现
前言:在应用于集团版客户或SAAS平台服务的业务系统中,流程管理系统需要支持多用户组织模型.其中包括角色数据.流程定义数据和流程实例数据的多用户标识绑定.本文旨在全面描述如何基于SlickOne敏捷开 ...
- java并发基础(四)--- 取消与中断
<java并发编程实战>的第7章是任务的取消与关闭.我觉得这一章和第6章任务执行同样重要,一个在行为良好的软件和勉强运行的软件之间的最主要的区别就是,行为良好的软件能很完善的处理失败.关闭 ...
- JTAG - General description of the TAP Controller states
A transition between the states only occurs on the rising edge of TCK, and each state has a differen ...
- spanner-becoming-a-sql-system 2017
https://blog.acolyer.org/2017/07/03/spanner-becoming-a-sql-system/?utm_source=tuicool&utm_medium ...
- Visio中如何绘制黑白图像
- Object [object Object] has no method 'live'
用了2个jquery的2个文件: <script src="~/Scripts/jquery-1.10.2.js"></script> <script ...