hdu 1251
統計難題
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 9806 Accepted Submission(s): 3949
Problem Description
Ignatius最近遇到一個難題,老師交給他很多單詞(只有小寫字母組成,不會有重復的單詞出現),現在老師要他統計出以某個字符串為前綴的單詞數量(單詞本身也是自己的前綴).
Input
輸入數據的第一部分是一張單詞表,每行一個單詞,單詞的長度不超過10,它們代表的是老師交給Ignatius統計的單詞,一個空行代表單詞表的結束.第二部分是一連串的提問,每行一個提問,每個提問都是一個字符串.
注意:本題只有一組測試數據,處理到文件結束.
注意:本題只有一組測試數據,處理到文件結束.
Output
對于每個提問,給出以該字符串為前綴的單詞的數量.
Sample Input
banana band bee absolute acm ba b band abc
Sample Output
2 3 1 0
每天學點新東西
今天學了點trie,以前只聞其名,未曾寫過,今天自習看了看,貌似不難
照著ac自動機的模版寫了第一個trie的程序(囧),1Y#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <cassert>
#include <iostream>
#include <sstream>
#include <fstream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <algorithm>
#include <iomanip>
using namespace std;
struct node
{
int next[26];
int x;
int count;
void init()
{
memset(next,-1,sizeof(next));
count=0;
}
} s[5000005];
int ind,sind;
void cas_init()
{
s[0].init();
sind=1;
}
void ins(char str[])
{
int len=strlen(str);
int i,j,ind;
for(i=ind=0;i<len;i++)
{
j=str[i]-'a';
if(s[ind].next[j]==-1)
{
s[sind].init();
s[ind].next[j]=sind++;
}
s[ind].count++;
ind=s[ind].next[j];
}
s[ind].count++;
}
int search(char str[])
{
int ind,i,j,len=strlen(str);
ind=0;
for(i=0;i<len;i++)
{
j=str[i]-'a';
if(s[ind].next[j]==-1)
return 0;
else ind=s[ind].next[j];
}
return s[ind].count;
}
int main()
{
char str[15];
int num;
cas_init();
while(gets(str)&&str[0]!='\0') ins(str);
while(gets(str))
{
num=0;
num=search(str);
printf("%d\n",num);
}
return 0;
}
就是這個hdu1251