统计难题

hdoj1251

题目大意: 求出以某字符串为前缀的单词的数量

解决:trie树 

#include <iostream>
#include <cstring>
using namespace std;
struct node
{
    int cnt;
    int next[26];
};
node trie[3000000];
int top=0;
void init()
{//初始化字典树,0号为根节点,只需将next值置为0就行了
   memset(trie[0].next,0,sizeof(trie[0].next));
    top=1;
}

void insert(char *str)
{
    int i=0,id;//i为根节点
    while(*str)
    {
        id=*str-'a';
        if(trie[i].next[id]==0)
        {//若为空,开辟新空间,并初始化新空间
            trie[i].next[id]=top;
            trie[top].cnt=1;
            memset(trie[top].next,0,sizeof(trie[top].next));
            top++;
            i=trie[i].next[id];
        }
        else 
        {//若不空,指向下一个地址,并对下一个地址的元素操作
            i=trie[i].next[id];
            trie[i].cnt++;
        }
        str++;
    }
}

int search(char *str)
{
    int i=0,id;
    while(*str)
    {
        id=*str-'a';
        if(trie[i].next[id]==0)return 0;
        i=trie[i].next[id];
        str++;
    }
    return trie[i].cnt;
}

int main()
{
    char str[15];
    init();
    while(gets(str),strcmp(str,"")!=0)insert(str);
    while(~scanf("%s",str))printf("%d\n", search(str));
 //   system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/hpustudent/p/2133905.html