统计难题

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;

}

你可能感兴趣的:(统计)