HDU1251(静态维护字典树模板题)

来源:互联网 发布:sql注入攻击登录 编辑:程序博客网 时间:2024/05/17 06:25

字典树入门还是很简单了,30分钟就差不多可以手撕动态维护的板子了。但是这个题用动态维护字典树会MLE,几乎网上所有动态维护的都TLE了。可怕,就算释放也会(虽然只有一次建树,释不释放一个样子)。于是继续学习静态维护字典树。其实静态维护就是用数组模拟建树,答题思路类似链式前向星。
静态维护的时候还要注意数组开的大小,一开始大方100万数字,MLE。84000K,题目要求65535K
别太大方,50万就可以了。
code:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<iostream>#include<string>#include <set>#include<time.h>using namespace std;#define ll long long#define mem(a) memset(a,0,sizeof(a))const double eps=1e-8;const int maxn=500010;//ÐëÌîдconst int inf=0x3f3f3f3f;int tree[maxn][26];int tim[maxn];int cnt;void init(){    mem(tree);    cnt=0;}void inst(char str[]){    int len=strlen(str);    int index=0;    for(int i=0;i<len;i++)    {        int num=str[i]-'a';        if(tree[index][num]==0)        {            tree[index][num]=++cnt;        }        index=tree[index][num];        tim[index]++;    }}int treefind(char str[]){    int len=strlen(str);    int index=0;    for(int i=0;i<len;i++)    {        int num=str[i]-'a';        if(tree[index][num]==0)            return 0;        index=tree[index][num];    }    return tim[index];}int main(){    init();    char str[20];    int res;    while(gets(str)&&strcmp(str,"")!=0)    {        inst(str);    }    while(scanf("%s",str)!=EOF)    {        res=treefind(str);        printf("%d\n",res);    }    return 0;}
原创粉丝点击