hdu1251 統計難題

Description

Ignatius最近遇到一個難題,老師交給他很多單詞(只有小寫字母組成,不會有重複的單詞出現),現在老師要他統計出以某個字符串爲前綴的單詞數量(單詞本身也是自己的前綴).

Input

輸入數據的第一部分是一張單詞表,每行一個單詞,單詞的長度不超過10,它們代表的是老師交給Ignatius統計的單詞,一個空行代表單詞表的結束.第二部分是一連串的提問,每行一個提問,每個提問都是一個字符串.

注意:本題只有一組測試數據,處理到文件結束.

Output

對於每個提問,給出以該字符串爲前綴的單詞的數量.

Sample Input

banana band bee absolute acm ba b band abc

Sample Output

2 3 1 0

AC Code

G++ MLE         C++ AC

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <queue>
#include <time.h>
#define inf 0x3f3f3f3f
#define maxn 32005
#define MOD 50000
using namespace std;
const double pi=acos(-1.0),ee=2.7182818284590452354;

typedef struct node{
	int sum;
	struct node* next[26];
}*trie,tr;
trie root;

void init_trie(trie &p)
{
	int i;
	p=(trie)malloc(sizeof(tr));
	p->sum=0;
	for(i=0;i<26;i++)
		p->next[i]=0;
}

void insert(char str[])
{
	int i=0;
	trie p=root;
	while(str[i]!='\0')
	{
		if(!(p->next[str[i]-'a']))
		{
			trie q;
			init_trie(q);
			p->next[str[i]-'a']=q;
		}
		p=p->next[str[i]-'a'];
		p->sum++;
		i++;
	}
	return;
}

int query(char str[])
{
	int i=0;
	trie p=root;
	while(str[i]!='\0'&&p->next[str[i]-'a'])
	{
		p=p->next[str[i++]-'a'];
	}
	if(str[i]=='\0')
		return p->sum;
	else return 0;
}

int main(int argc, char** argv) {
	char a[20];
	init_trie(root);
	while(cin>>a)
	{
		int t;
		insert(a);
		getchar();
		t=getchar();
		if(t==10) break;
		else ungetc(t,stdin);
	}
	while(cin>>a)
	{
		cout<<query(a)<<endl;
	}
	return 0;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章