标签:tca ted orm get rom ++ find sub cell
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4776 Accepted Submission(s): 2227
题目链接: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(字典树数组版)
标签:tca ted orm get rom ++ find sub cell
原文地址:http://www.cnblogs.com/Blackops/p/6081774.html