统计难题

http://acm.hdu.edu.cn/showproblem.php?pid=1251

通过这道题学习一下Trie字典树.

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <list>
#include <cctype>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define REP(i,j,k) for(int i = j ; i < k ; ++i)
#define MAXV (1000)
#define INF (0x6FFFFFFF)
#define MAX 26
using namespace std;
typedef struct Trie
{
    Trie *next[MAX];
    int v;//这里表示该字符前缀出现的次数
};
Trie *root;

void Insert(char *str)
{
    Trie *current = root;
    int  len=strlen(str);
    if(len==0) return ;
    REP(i,0,len)
    {
        //若节点存在,则直接访问下一个节点,并此前缀出现次数+1
        if(current->next[str[i]-'a']!=NULL)
        {
            current=current->next[str[i]-'a'];
            current->v++;
        }
        //若节点不存在,则新建节点并初始化
        else
        {
            current->next[str[i]-'a']=(Trie*)malloc(sizeof(Trie));
            current=current->next[str[i]-'a'];
            REP(i,0,26) current->next[i]=NULL;
            current->v=1;
        }
    }
}
int Find(char *str)
{
    int len=strlen(str);
    struct Trie *current=root;
    if(len==0) return 0;
    REP(i,0,len)
    {
        //如果关键词本字符存在,则访问下一个节点
        if(current->next[str[i]-'a']!=NULL)
            current=current->next[str[i]-'a'];
        else
            return 0;//不存在直接返回0
    }
    return current->v;//返回该前缀出现次数
}
void Init()
{
    root=(Trie *)malloc(sizeof(Trie));
    REP(i,0,26) root->next[i]=NULL;
    root->v=1;
}
int main()
{
    Init();
    char str[11];
   // freopen("in.txt","r",stdin);
    while(gets(str)&&strcmp(str,"")!=0)
            Insert(str);
    char tmp[11];
    while(~scanf("%s",tmp))
        printf("%d\n",Find(tmp));
    return 0;
}

 

posted @ 2013-06-06 20:41  丶Blank  阅读(172)  评论(0)    收藏  举报