HDU 4287 Intelligent IME(字典树数组版)
Intelligent IME
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4776 Accepted Submission(s): 2227
2 : a, b, c 3 : d, e, f 4 : g, h, i 5 : j, k, l 6 : m, n, o
7 : p, q, r, s 8 : t, u, v 9 : w, x, y, z
When we want to input the word “wing”, we press the button 9, 4, 6, 4, then the input method will choose from an embedded dictionary, all words matching the input number sequence, such as “wing”, “whoi”, “zhog”. Here comes our question, given a dictionary, how many words in it match some input number sequences?
Two integer N (1 <= N <= 5000), M (1 <= M <= 5000), indicating the number of input number sequences and the number of words in the dictionary, respectively. Then comes N lines, each line contains a number sequence, consisting of no more than 6 digits. Then comes M lines, each line contains a letter string, consisting of no more than 6 lower letters. It is guaranteed that there are neither duplicated number sequences nor duplicated words.
题目链接:HDU 4287
由于最近要学AC自动机的缘故,指针版的字典树虽然好写但是速度慢且容易爆内存,于是就膜了一下数组版的字典树,略微麻烦了一丢丢,但是可操作性比指针的高,速度比指针的快非常多……,于是就拿这题试验了一下,数组版字典树是用下标来替代指针的作用,而且空间都是预先分配好的,只要不把下标标向某一层,这一层就不会被用到,就相当于未出现,没有被分配内存。tot表示当前节点个数,显然一开始tot=1,因为有一个表头(对应于链表里的Nodelist *L),且表头的数组下标刚好是0,每一次分配就把L[tot]这一层的内容给初始化,再把这个连到L[now]->nxt[v]上即可。这题做法非常简单,就是问你每一个按键顺序可以分别打出下面几个字符串,显然把字典树结构体中加一个id表示当前是第几组按键,再把接下来的m个字符转换成对应的按键顺序再拿去查询,返回最后查到的那个id再把这个对应的按键次数+1即可。对了这个空间复杂度大概就开max_len * Tot_cnt就大概可以了,具体不清楚到底要开多少,反正暂时开这么多似乎题目都还可以过。话说把init作为成员函数里面还真是方便…………
代码:
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=5010;
struct Trie
{
int nxt[10];
int id;
inline void init()
{
CLR(nxt,0);
id=-1;
}
};
Trie L[N*7];
int tot,ans[N];
char s[10];
char change[10]; void init()
{
L[0].init();
tot=1;
CLR(ans,0);
}
void update(char s[],int id)
{
int now=0,len=strlen(s);
for (int i=0; i<len; ++i)
{
int v=s[i]-'0';
if(!L[now].nxt[v])
{
L[tot].init();
L[now].nxt[v]=tot++;
}
now=L[now].nxt[v];
}
L[now].id=id;
}
int Find(char s[])
{
int now=0;
int len=strlen(s);
for (int i=0; i<len; ++i)
{
int v=s[i]-'0';
if(!L[now].nxt[v])
return -1;
now=L[now].nxt[v];
}
return L[now].id;
}
inline int getid(const char &x)
{
if(x>='a'&&x<='c')
return 2;
else if(x>='d'&&x<='f')
return 3;
else if(x>='g'&&x<='i')
return 4;
else if(x>='j'&&x<='l')
return 5;
else if(x>='m'&&x<='o')
return 6;
else if(x>='p'&&x<='s')
return 7;
else if(x>='t'&&x<='v')
return 8;
else
return 9;
}
int main(void)
{
int tcase,n,m,i;
scanf("%d",&tcase);
while (tcase--)
{
init();
scanf("%d%d",&n,&m);
for (i=0; i<n; ++i)
{
scanf("%s",s);
update(s,i);
}
for (i=0; i<m; ++i)
{
scanf("%s",s);
int len=strlen(s);
for_each(s,s+len,[](char &c){c=getid(c)+'0';});
int indx=Find(s);
if(indx!=-1)
++ans[indx];
}
for_each(ans,ans+n,[&](const int &c){printf("%d\n",c);});
}
return 0;
}
HDU 4287 Intelligent IME(字典树数组版)的更多相关文章
- ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)
Description We all use cell phone today. And we must be familiar with the intelligent English input ...
- HDU 4287 Intelligent IME(map运用)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4287 Intellig ...
- HDU 4287 Intelligent IME(字典树)
在我没用hash之前,一直TLE,字符串处理时间过长,用了hash之后一直CE,(请看下图)我自从经历我的字典树G++MLE,C++AC以后,一直天真的用C++,后来的CE就是因为这个,G++才支持这 ...
- HDU 4287 Intelligent IME hash
Intelligent IME Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- HDU 4287 Intelligent IME
Intelligent IME Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4287 Intelligent IME(string,map,stl,make_pair)
题目 转载来的,有些stl和string的函数蛮好的: //numx[i]=string(sx); //把char[]类型转换成string类型 // mat.insert(make_pair(num ...
- hdu 1671 Phone List 字典树
// hdu 1671 Phone List 字典树 // // 题目大意: // // 有一些电话号码的字符串长度最多是10,问是否存在字符串是其它字符串的前缀 // // // 解题思路: // ...
- hdu 1251 统计难题 (字典树入门题)
/******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...
- HDU 5536 Chip Factory 字典树
Chip Factory Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
随机推荐
- hdu 2102 A计划-bfs
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- PyCharm默认快捷键
转自:http://www.2cto.com/os/201410/341542.html 1.编辑(Editing)Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + ...
- Codeforces 546E Soldier and Traveling(最大流)
题目大概说一张无向图,各个结点初始有ai人,现在每个人可以选择停留在原地或者移动到相邻的结点,问能否使各个结点的人数变为bi人. 如此建容量网络: 图上各个结点拆成两点i.i' 源点向i点连容量ai的 ...
- apache activemq 学习笔记
0.activemq的概念 activemq实现了jms(java Message server),用于接收,发送,处理消息的开源消息总线. 1.activemq和jms的区别 jms说白了就是jav ...
- BZOJ 1013 & 高斯消元
题意: 告诉你一个K维球体球面上的K+1个点问球心坐标. sol: 乍一看还以为是K维的二分答案然后判断距离...真是傻逼了...你看乱七八糟的题目做多了然后就会忘记最有用的基本计算... 我们可以看 ...
- HDU 3090 (贪心)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3090 题目大意:一共n段路.每段路每千米都会被抢劫一定数量,可以雇佣武士护卫m千米.问最少被抢劫数量 ...
- Here's what C++ is
Yes this article describes what c++ exactlyis http://www.skywind.me/blog/archives/1398#comment-3671 ...
- [BZOJ2794][Poi2012]Cloakroom
2794: [Poi2012]Cloakroom Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 167 Solved: 119[Submit][St ...
- POJ 1106 Transmitters(计算几何)
题目链接 切计算几何,感觉计算几何的算法还不熟.此题,枚举线段和圆点的直线,平分一个圆 #include <iostream> #include <cstring> #incl ...
- MathType的公式在word中跟文字不对齐
引用http://blog.sina.com.cn/s/blog_4d1f40c00100net8.html 部分Mathtype公式与文档文字没有很好的对齐,而是浮起来了,也就是说Mathtype公 ...