1. 程式人生 > >(HDU)1251

(HDU)1251

統計難題

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 banana band bee absolute acm ba b band abc
Sample Output 2 3 1 0
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 26
typedef 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;
}