(HDU)1251
阿新 • • 發佈:2019-02-05
統計難題
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
我的程式碼:
kuangbin部落格貼的程式碼(指標):#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; }
/************ 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;
}