动态建树加深搜之——模仿手机九键输入法
来源:互联网 发布:小额贷款那个软件最好 编辑:程序博客网 时间:2024/06/08 03:46
题目:poj1451
题意:给你一个词语出现次数的表,然后给你一个输入的数字串,每一步输出它最可能出现的单词。没有了就输出一个东西。
解答:建一个字典树,然后深度遍历这课树。每遍历一步都要记录下当前的字符串。最后输出。要记录当前位置最大值。如果该步没有更新过最大值说明这一步找不到字母了。
用一个str数组记录当前的串。用k记录搜到多长了。注意回溯!还有,不管更新不更新答案,只要有就要继续往下搜。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string.h>#include<cmath>#include<stdlib.h>using namespace std;const int MAXN = 1010;const int maxn = 110;const int sonnum = 26,base = 'a';int dir[11] = {0,0,0,3,6,9,12,15,19,22,26};int Max[maxn];char ans[maxn][maxn],str[maxn],numarr[maxn];int n,m,k,p,len;struct Trie{ int num; bool terminal; struct Trie *son[sonnum];};Trie *NewTrie(){ Trie *temp = new Trie; temp -> num = 1; for(int i = 0;i < sonnum;i++) { temp -> son[i] = NULL; } return temp;}void Insert(Trie *pnt,char *s,int a){ Trie *tmp = pnt; int len1 = strlen(s); for(int i = 0;i < len1;i++) { if(tmp -> son[s[i]-base] == NULL) { tmp -> son[s[i]-base] = NewTrie(); tmp -> son[s[i]-base] -> num += (a - 1); } else tmp -> son[s[i]-base] -> num += a; tmp = tmp -> son[s[i]-base]; }}void dfs(Trie *pnt,int step){ int start = dir[numarr[step]]; int End = dir[numarr[step]+1]; Trie *tmp = pnt; for(int i = start;i < End;i++) { if(tmp -> son[i] == NULL) continue; k++;//k表示当前的深度 str[k] = i + base; if(tmp -> son[i] -> num > Max[k])//如果最大则更新答案 { Max[k] = tmp -> son[i] -> num; str[k+1] = 0; strcpy(ans[k],str); } if(k != len-1) dfs(tmp->son[i],step+1); k--; }}int main(){ int T; char input[MAXN]; scanf("%d",&T); for(int i = 1;i <= T;i++) { scanf("%d",&n); Trie *tree = NewTrie(); for(int j = 1;j <= n;j++) { scanf("%s %d",input,&p); Insert(tree,input,p); } scanf("%d",&m); printf("Scenario #%d:\n",i); while(m--) { scanf("%s",numarr); len = strlen(numarr); len--; k = -1; memset(Max,-1,sizeof(Max));/// dfs(tree,0); int w; for(w = 0;w < len;w++) { if(Max[w]!=-1) { printf("%s\n",ans[w]); } else break; } for(int j = w;j < len;j++) printf("MANUALLY\n"); printf("\n"); } printf("\n"); } return 0;}
0 0
- 动态建树加深搜之——模仿手机九键输入法
- 动态建树之——查字典
- 动态建树之——寻找最长公共前缀
- 动态建树之——出现了几次的单词有几个
- 动态建树之——寻找前缀是否是其他字符串
- 关于产品的一些思考——搜狐之搜狗输入法(手机版)
- 动态建树之——一个单词是否在其他单词中以前缀的形式存在
- Android自定义View——动态ProgressBar之模仿360加速球
- 博弈论专题——推理与动态规划相关博弈之POJ2484 POJ1740(模仿游戏)
- 搜狗手机输入法
- 手机模仿ppt之20效果
- 手机开发实战48——手机输入法介绍1
- 手机开发实战49——手机输入法介绍2
- AC自动机 ( 动态建树模板 )——Keywords Search ( HDU 2222 )
- POJ 2503 动态建树
- trie动态建树与静态建树
- 字典树 静态建树与动态建树
- [MD]模仿百度手机助手动态折线图
- My First Blog
- UNITY之加载
- python 实例变量
- Linux socket 获取温度上报服务器
- C++设计模式之观察者模式
- 动态建树加深搜之——模仿手机九键输入法
- spring cloud config 配置自建git服务器
- 机器学习(2.100)数据知识积累——香农熵
- 关于主键和外键,我犯傻了
- 自定义事件
- 手把手教你给一个iOS app配置多个环境变量
- 290. Word Pattern
- SpringMVC实战-多文件上传
- 原创JS