背景:为了方便九宫格手机用户发短信,希望在用户按键时,根据提供的字典(给出字符串和频数),给出各个阶段最有可能要打的单词。

题意: 首先给出的是字典,每个单词有一个出现频率。然后给出的是询问,每个询问有一个数字字符串,代表在手机上按了哪些键,以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 (字典树好题)的更多相关文章

  1. POJ 1451 - T9 - [字典树]

    题目链接:http://bailian.openjudge.cn/practice/1451/ 总时间限制: 1000ms 内存限制: 65536kB 描述 Background A while ag ...

  2. 字典树模板题(统计难题 HDU - 1251)

    https://vjudge.net/problem/HDU-1251 标准的字典树模板题: 也注意一下输入方法: #include<iostream> #include<cstdi ...

  3. CH 1601 - 前缀统计 - [字典树模板题]

    题目链接:传送门 描述给定 $N$ 个字符串 $S_1,S_2,\cdots,S_N$,接下来进行 $M$ 次询问,每次询问给定一个字符串 $T$,求 $S_1 \sim S_N$ 中有多少个字符串是 ...

  4. HDU 1251 统计难题(字典树模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:给出一些单词,然后有多次询问,每次输出以该单词为前缀的单词的数量. 思路: 字典树入门题. #inc ...

  5. hdu1305 字典树水题

    题意:      给你一些字符串,然后问你他们中有没有一个串是另一个串的前缀. 思路:       字典树水题,(这种水题如果数据不大(这个题目不知道大不大,题目没说估计不大),hash下也行,把每个 ...

  6. hdu 1251 统计难题 (字典树入门题)

    /******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...

  7. POJ 1451 T9

    T9 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3083   Accepted: 1101 Description Ba ...

  8. HDU1251 字典树板子题

    题意:中文题,统计以某字符串作为前缀的字符串个数 刚学字典树,理解起来十分简单,就是维护一个多叉树,这里用的是链表版本,后面就用的是数组版本了,个人更喜欢数组版本,这里的链表版本就因为 莫名其妙的错误 ...

  9. hdu 1251 统计难题 字典树第一题。

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

随机推荐

  1. 002.RAID创建

    一 创建相应的分区 [root@kauai ~]# fdisk /dev/sdb 最终创建多个用于做RAID的分区,如下: Device Boot Start End Blocks Id System ...

  2. java go

    熟练掌握java技术,对多线程.数据结构有清晰的认识: 熟悉MySQL/Oracle数据库,熟悉关系数据库应用设计开发: 熟悉Spring/MyBatis/Freemarker等一种或者多种框架: j ...

  3. 使用Xcode打包上传APP

    1.打开xcode,进入product->Scheme->EditScheme,找到Archive,最上面的设备选择IOSDevice,在BuildConfiguration中选中Rele ...

  4. 详解没有dSYM文件 如何解析iOS崩溃日志

    Xcode支持崩溃日志自动符号化,前提是本地有当时Build/Archive生成的dSYM文件,iOS崩溃日志符号化后,可以帮助开发者更好的定位问题,但如果dSYM文件丢失或拿到的崩溃日志不是标准的c ...

  5. 使用 IntraWeb (17) - 基本控件之 TIWRadioButton、TIWRadioGroup、TIWCheckBox

    TIWRadioButton //单选 TIWRadioGroup //单选组 TIWCheckBox //复选 TIWRadioButton 所在单元及继承链: IWCompRadioButton. ...

  6. .Net中常用的重要的第三方组件

    RSS.NET.dll RSS.NET是一款操作RSS feeds的开源.NET类库.它为解析和编写RSS feeds提供了一个可重用的对象模型.它完全兼容RSS 0.90, 0.91, 0.92, ...

  7. 用docker搭建ss访问火星

    最近弄了个vultr的VPS,便想用它搭个梯子访问火星.由于vultr是支持docker的,便找了个ss的docker镜像: https://hub.docker.com/r/mritd/shadow ...

  8. 下载8000首儿歌的python代码

    下载8000首儿歌的python的代码: #-*- coding: UTF-8 -*- from pyquery import PyQuery as py from lxml import etree ...

  9. 未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试

    报错:未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试 → 尝试以"管理员身份"运行程序, ...

  10. WCF X.509证书双向认证小结

    最近在学习WCF X.509证书验证,想实现使用证书实现服务端和客户端的双向认证,实现原理是利用了数字证书包含的一对非对称密钥来实现数字签名及加密.所谓非对称密钥是采用两个密钥将加密和解密能力分开:一 ...