码迷,mamicode.com
首页 > 其他好文 > 详细

/*字典树*/一些简单题

时间:2015-07-30 17:11:21      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

原理很简单,,,,,肯定能看懂,,,我觉得实现费点劲。。。。。

我的模板:

#include <iostream>
#include<bits/stdc++.h>

using namespace std;

#define  MAX  26

typedef struct TrieNode
{
 int nCount;  // 该节点前缀 出现的次数
 struct TrieNode *next[MAX]; //该节点的后续节点
} TrieNode;

TrieNode Memory[1000000]; //先分配好内存。 malloc 较为费时
int allocp = 0;

//初始化一个节点。nCount计数为1, next都为null
TrieNode * createTrieNode()
{
 TrieNode * tmp = &Memory[allocp++];
 tmp->nCount = 1;
 for (int i = 0; i < MAX; i++)
  tmp->next[i] = NULL;
 return tmp;
}

void insertTrie(TrieNode * * pRoot, char * str)
{
 TrieNode * tmp = *pRoot;
 int i = 0, k;
 //一个一个的插入字符
 while (str[i])
 {
  k = str[i] - ‘a‘; //当前字符 应该插入的位置
  if (tmp->next[k])
  {
   tmp->next[k]->nCount++;
  }
  else
  {
   tmp->next[k] = createTrieNode();
  }

  tmp = tmp->next[k];
  i++; //移到下一个字符
 }

}

int searchTrie(TrieNode * root, char * str)
{
 if (root == NULL)
  return 0;
 TrieNode * tmp = root;
 int i = 0, k;
 while (str[i])
 {
  k = str[i] - ‘a‘;
  if (tmp->next[k])
  {
   tmp = tmp->next[k];
  }
  else
   return 0;
  i++;
 }
 return tmp->nCount; //返回最后的那个字符  所在节点的 nCount
}

int main(void)
{
 char s[30];
 TrieNode *Root = createTrieNode();
 while (gets(s) && s[0] != ‘0‘) //读入0 结束
 {
  insertTrie(&Root, s);
 }

 while (gets(s)) //查询输入的字符串
 {
  printf("%d\n", searchTrie(Root, s));
 }
 return 0;
}

这个方法很快。。。。。

/*有的题要用C++不用G++要不容易超内存*/

HDU1004:

稍稍变形。。。。。。

#include<stdio.h>
#include <string.h>

using namespace std;

typedef struct node
{
    struct node *next[26];
    int cnt;
}node;

node memory[100000];
int allocp;
int ans;
char an[30];

node *create()
{
    node *tmp=&memory[allocp++];
    for(int i=0;i<26;i++) tmp->next[i]=NULL;
    tmp->cnt=0;
    return tmp;
}

int inserttrie(node **proot,char *s)
{
    node *tmp=*proot;
    int i=0,k;
    while(s[i])
    {
        k=s[i]-‘a‘;
        if(tmp->next[k]);
        else
        {
            tmp->next[k]=create();
        }
        if(i==strlen(s)-1)
        {
            tmp->next[k]->cnt++;
            //printf("%d*\n",tmp->next[k]->cnt);
        }
        if(tmp->next[k]->cnt>=ans)
        {
            ans=tmp->next[k]->cnt;
            strcpy(an,s);
            //puts(an);
            //printf("%d\n",tmp->next[k]->cnt);
        }
        tmp=tmp->next[k];
        i++;
    }
    return ans;
}


int main()
{
    int m;
    char a[100];
    node *root=create();
    while(scanf("%d",&m)&&m!=0)
    {
        memset(memory,0,sizeof(memory));
        allocp=0;
        ans=0;
        int i;
        for(i=0;i<m;i++)
        {
            scanf("%s",a);
            inserttrie(&root,a);
        }
        printf("%s\n",an);
    }
    return 0;
}

HDU1075 可以不用字典树做,,,,用pair就好了,,模拟。。。。

字典树注意比如输入fiw,,输出还是fiw;

#include<stdio.h>
#include <string.h>

using namespace std;

char a[15],b[15];

typedef struct node
{
  char s[15];
  struct node *next[26];
};
node memory[1000000];
int allocp=0;

node * create()
{
    node * tmp=&memory[allocp++];
    for(int i=0;i<26;i++) tmp->next[i]=NULL;
    tmp->s[0]=‘\0‘;
    return tmp;
}

void inserttrie(node ** proot,char *b)
{
    node * tmp=*proot;
    int i=0,k;
    while(b[i])
    {
        k=b[i]-‘a‘;
        if(tmp->next[k]);
        else
            tmp->next[k]=create();
        if(i==strlen(b)-1) {strcpy(tmp->next[k]->s,a);} //printf("%s****\n",tmp->next[k]->s);
        tmp=tmp->next[k];
        i++;
    }
}

int searchtrie(node *root,char *s)
{
    if(root==NULL) return 0;
    node* tmp = root;
    int i=0,k;
    while(s[i])
    {
        k=s[i]-‘a‘;
        if(tmp->next[k])
        {
            tmp=tmp->next[k];
        }
        else return 0;
        i++;
    }
    if(tmp->s[0]==0) return 0;
    printf("%s",tmp->s);
    return 1;
}


int main()
{
    scanf("%s",a);
    char c[10001];
    char d[500];
    node * root=create();
    while(scanf("%s",a)==1)
    {
        if(strcmp(a,"END")==0) break;
        scanf("%s",b);
        int flag=0;
        inserttrie(&root,b);
    }
    scanf("%s",a);
    getchar();
    while(1)
    {
        gets(c);
        //printf("%s**\n",c);
        if(c[0]==‘S‘&&c[1]==‘T‘&&c[2]==‘A‘&&c[3]==‘R‘&&c[4]==‘T‘) continue;
        if(c[0]==‘E‘&&c[1]==‘N‘&&c[2]==‘D‘) break;
        int t=0;
        for(int i=0;i<strlen(c);i++)
        {
            if(c[i]>=‘a‘&&c[i]<=‘z‘)
            {
                d[t++]=c[i];
                if(i==strlen(c)-1) {if(searchtrie(root,d)==0) printf("%s",d);}
            }
            else if((c[i-1]>=‘a‘&&c[i-1]<=‘z‘))
            {
                //printf("%s***\n",d);
                if(searchtrie(root,d)==0) printf("%s",d);
                printf("%c",c[i]);
                memset(d,0,sizeof(d));
                t=0;
            }
            else printf("%c",c[i]);
        }
        puts("");
    }
    return 0;
}

HDU4287

#include<stdio.h>
#include <string.h>

using namespace std;

char a[5005][10];
char b[10];

typedef struct node
{
    struct node *next[10];
    int cnt;
}node;

node memory[200000];
int allocp;

void bianhuan()
{
    for(int i=0;i<strlen(b);i++)
    {
        if(b[i]==‘a‘||b[i]==‘b‘||b[i]==‘c‘) b[i]=‘2‘;
        if(b[i]==‘d‘||b[i]==‘e‘||b[i]==‘f‘) b[i]=‘3‘;
        if(b[i]==‘g‘||b[i]==‘h‘||b[i]==‘i‘) b[i]=‘4‘;
        if(b[i]==‘j‘||b[i]==‘k‘||b[i]==‘l‘) b[i]=‘5‘;
        if(b[i]==‘m‘||b[i]==‘n‘||b[i]==‘o‘) b[i]=‘6‘;
        if(b[i]==‘p‘||b[i]==‘q‘||b[i]==‘r‘||b[i]==‘s‘) b[i]=‘7‘;
        if(b[i]==‘t‘||b[i]==‘u‘||b[i]==‘v‘) b[i]=‘8‘;
        if(b[i]==‘w‘||b[i]==‘x‘||b[i]==‘y‘||b[i]==‘z‘) b[i]=‘9‘;
    }
}

node *create()
{
    node *tmp=&memory[allocp++];
    tmp->cnt = 0;
    for(int i=0;i<10;i++)
    {
        tmp->next[i] = NULL;
    }
    return tmp;
}

void inserttrie(node **proot,char *s)
{
    node *tmp=*proot;
    int i=0,k;
    while(s[i])
    {
        k=s[i]-‘0‘;
        if(tmp->next[k]);
        else tmp->next[k]=create();
        tmp=tmp->next[k];
        i++;
        if(i==strlen(s))
        {
            tmp->cnt++;
        }
    }
}

int searchtrie(node *root,char *s)
{
    if(root==NULL) return 0;
    node *tmp=root;
    int i=0,k;
    while(s[i])
    {
        k=s[i]-‘0‘;
        if(tmp->next[k])
            tmp=tmp->next[k];
        else return 0;
        i++;
    }
    return tmp->cnt;
}

int main()
{
    int m;
    scanf("%d",&m);
    int w1,w2;
    while(m--)
    {
        memset(memory,0,sizeof(memory));
        allocp=0;
        node *root=create();
        scanf("%d %d",&w1,&w2);
        int i;
        for(i=0;i<w1;i++)
            scanf("%s",a[i]);
        for(i=0;i<w2;i++)
        {
            scanf("%s",b);
            bianhuan();
            inserttrie(&root,b);
        }
        //printf("*\n");
        for(i=0;i<w1;i++)
            printf("%d\n",searchtrie(root,a[i]));
    }
    return 0;
}

字典树就差不多这样了。。。。。。。。。恩恩!




版权声明:本文为博主原创文章,未经博主允许不得转载。

/*字典树*/一些简单题

标签:

原文地址:http://blog.csdn.net/zhangwenchi/article/details/47105617

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!