(HDU)1251

来源:互联网 发布:oracle数据库to date 编辑:程序博客网 时间:2024/06/14 11:17

统计难题

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 38204    Accepted Submission(s): 14031


Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 

Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.
 

Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 

Sample Input
bananabandbeeabsoluteacmbabbandabc
 

Sample Output
2310
 

Author
Ignatius.L
 


我的代码:

#include <bits/stdc++.h>using namespace std;struct node{    int next[26];    int cnt;    void init()    {        cnt=0;        memset(next,-1,sizeof(next));    }}T[1000000];char s[1000];int tot;void insert(char* s){    int i,p=0,len=strlen(s);    for(i=0;i<len;i++)    {        int x=s[i]-'a';        if(T[p].next[x]==-1)        {            T[tot].init();            T[p].next[x]=tot++;        }        p=T[p].next[x];        T[p].cnt++;    }}int query(char *s){    int i,p=0,len=strlen(s);    for(i=0;i<len;i++)    {        int x=s[i]-'a';        if(T[p].next[x]==-1)        {            T[tot].init();            T[p].next[x]=tot++;        }        p=T[p].next[x];    }    return T[p].cnt;}int main(){    T[0].init(); tot=1;    while(gets(s)&&s[0]){insert(s);}    while(gets(s)){ printf("%d\n",query(s));}    return 0;}


kuangbin博客贴的代码(指针):

/************HDU 1251 统计难题字典树模板 **************/#include<stdio.h>#define MAX 26typedef struct TrieNode{    int nCount;    struct TrieNode *next[MAX];}TrieNode;TrieNode Memory[1000000];int allocp=0;void InitTrieRoot(TrieNode **pRoot){    *pRoot=NULL;}        TrieNode *CreateTrieNode(){    int i;    TrieNode *p;        p=&Memory[allocp++];    p->nCount=1;    for(i=1;i<MAX;i++)    {        p->next[i]=NULL;    }        return p;}    void InsertTrie(TrieNode **pRoot,char *s){    int i,k;    TrieNode *p;        if(!(p=*pRoot))      p=*pRoot=CreateTrieNode();    i=0;    while(s[i])    {        k=s[i++]-'a';        if(p->next[k]) p->next[k]->nCount++;        else p->next[k]=CreateTrieNode();        p=p->next[k];    }    }    int SearchTrie(TrieNode **pRoot,char *s){    TrieNode *p;    int i,k;    if(!(p=*pRoot))      return 0;    i=0;    while(s[i])    {        k=s[i++]-'a';        if(p->next[k]==NULL) return 0;        p=p->next[k];    }        return p->nCount;}    int main(){    char str[11];    TrieNode *Root=NULL;    InitTrieRoot(&Root);    while(gets(str)&&str[0])    {        InsertTrie(&Root,str);    }        while(gets(str))    {        printf("%d\n",SearchTrie(&Root,str));    }        return 0;}


#include<stdio.h>#include<string.h>struct Node{    struct Node *br[26];    int num;};Node *head;void Tree_insert(char str[])//插入单词 {    Node *t,*s=head;    int i,j;    int len=strlen(str);    for(i=0;i<len;i++)    {        int id=str[i]-'a';        if(s->br[id]==NULL)        {            t=new Node;            for(j=0;j<26;j++)            {                t->br[j]=NULL;            }                t->num=0;            s->br[id]=t;        }            s=s->br[id];        s->num++;    }    }    int Tree_Find(char str[]){    Node *s=head;    int count,i;    int len=strlen(str);    for(i=0;i<len;i++)    {        int id=str[i]-'a';        if(s->br[id]==NULL)        {            return 0;        }            else        {            s=s->br[id];            count=s->num;        }        }        return count;}    int main(){    int i;    head=new Node;    for(i=0;i<26;i++)    {        head->br[i]=NULL;        head->num=0;    }        char str[12];    while(gets(str)&&str[0])  Tree_insert(str);    while(gets(str))  printf("%d\n",Tree_Find(str));    return 0;}




0 0
原创粉丝点击