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

题意: 首先给出的是字典,每个单词有一个出现频率。然后给出的是询问,每个询问有一个数字字符串,代表在手机上按了哪些键,以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. NLP自然语言处理系列5-支持向量机(SVM)

    1.什么是支持向量机 支持向量机(Support Vector Machine,SVM)是一种经典的分类模型,在早期的文档分类等领域有一定的应用.了解SVM的推导过程是一个充满乐趣和挑战的过程,耐心的 ...

  2. ES7/8新特性学习随笔

    随着每年EcmaScript都会为js带来一些新特性,带来更多美化的编程体验,今天就走进一下es2016/2017所带来的新特性 ES7新特性 includes() 指数操作符 ES8新特性 asyn ...

  3. 聊聊zookeeper的分布式锁

    分布式锁就是多台机器,分布在不同的JVM中,这些不同JVM内的方法需要获取一个唯一锁,比如获取锁之后要把数据写入数据库,保证数据在同一时刻只有一台机器写入数据库. 分布式锁的实现有多种实现方法,除了今 ...

  4. Java—Math类和随机数类

    一.Math类(主要封装算数运算的静态方法) 定义: Math是没有构造方法的. java语言中提供了一个执行数学基本运算的Math类,Math类包括常用的数学运算和一些数学函数.还提供了一些常用的常 ...

  5. Eth-Trunk链路聚合配置

    Eth-Trunk概述 Eth-Trunk接口能够实现负载分担.增加带宽和提高可靠性 Eth-Trunk接口把多个物理接口捆绑成一个逻辑接口 Eth-Trunk接口的链路聚合模式 链路聚合模式 应用场 ...

  6. BZOJ.2660.[BJOI2012]最多的方案(DP)

    题目链接 首先我们知道: 也很好理解.如果相邻两项出现在斐波那契表示法中,那它们显然可以合并. 所以我们能得到\(n\)的斐波那契表示,记\(pos[i]\)为\(n\)的斐波那契表示法中,第\(i\ ...

  7. .net 中的async,await理解

    理解: 1.async修饰的方法可理解为异步方法(必须要配合await,否则和普通方法无异)2.当async方法执行遇到await,则立即将控制权转移到async方法的调用者3.由调用者决定是否需要等 ...

  8. 接口开发-集成数据库操作(mybatis)

    关于数据存储,最常用的方式就是存到数据库,此篇以MySQL数据库为例,以mybatis框架完成数据库的操作. 一.添加对应依赖 <!-- 数据库:MySQL --> <depende ...

  9. Java使用独立数据库连接池(DBCP为例)

    目前,绝大多数的软件系统都会使用数据库,而在软件构建起来之后,访问数据库又成为软件系统性能的短板(I/O操作).一般来说一次访问数据库就需要一个数据库连接.而每次创建数据库连接都需要访问,分配空闲资源 ...

  10. 未能加载文件或程序集“System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项

    在发布网站时遇到如题错误. 错误消息详细信息:未能加载文件或程序集“System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=3 ...