比赛 20120302 评测结果 AAAAAAAAAA
题目名称 有道搜索框 最终得分 100
用户昵称 Makazeu 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-03-02 18:27:22
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define readfile(str) freopen(str,"r",stdin)
#define writefile(str) freopen(str,"w",stdout)
using namespace std;

const int base='a';
const int SonNum=26;
const int MAXN=10001;
char Word[MAXN][21];
class Trie
{
public:
	bool isStr;
	int pos;
	class Trie *Son[SonNum];
};

Trie *Root;
int Top=0;
int P=0;
int N,M;

Trie *NewTrie()
{
	Trie *temp=new Trie;
	temp->isStr=false;
	temp->pos=0;
	for(int i=0;i<SonNum;i++)
		temp->Son[i]=NULL;
	return temp;
}

void Insert(Trie *pnt,char *s,int len)
{
	Trie *temp=pnt;
	for(int i=0;i<len;i++)
	{
		if(temp->Son[s[i]-base]==NULL)
			temp->Son[s[i]-base]=NewTrie();
		temp=temp->Son[s[i]-base];
	}
	temp->isStr=true;
	temp->pos=Top;
}

void dfs(Trie *pnt)
{
	Trie *temp=pnt;
	if(temp->isStr)
	{
		if(P==0)
			printf("%s",Word[temp->pos]);
		else
			printf(" %s",Word[temp->pos]);
		P++;
	}
	if(P==8)
		return;
	for(int i=0;i<SonNum;i++)
	{
		if(P==8)
			return;
		if(temp->Son[i]!=NULL)
			dfs(temp->Son[i]);
	}
}

void Search(Trie *pnt,char *s,int len)
{
	Trie *temp=pnt;
	for(int i=0;i<len;i++)
	{
		if(temp->Son[s[i]-base]==NULL)
		{
			printf("%s",s);
			return;
		}
		temp=temp->Son[s[i]-base];
	}
	
	P=0;
	dfs(temp);
}

bool check(Trie *pnt,char *s,int len) 
{ 
    Trie *temp=pnt; 
    for (int i=0;i<len;i++) 
	{
		if(temp->Son[s[i]-base]==NULL)
			return false;
		temp=temp->Son[s[i]-base]; 
	}
    return temp->isStr;
} 

void init()
{
	Root=NewTrie();
	char str[20];
	int len;
	scanf("%d\n",&N);
	for(int i=1;i<=N;i++)
	{
		memset(str,'\0',sizeof(str));
		scanf("%s\n",str);
		len=strlen(str);
		if(check(Root,str,len))
			continue;
		Top++;
		for(int i=0;i<len;i++)
			Word[Top][i]=str[i];
		Insert(Root,str,len);
	}
	scanf("%d\n",&M);
	for(int i=1;i<=M;i++)
	{
		memset(str,'\0',sizeof(str));
		scanf("%s\n",str);
		Search(Root,str,strlen(str));
		if(i!=M)
			printf("\n");
	}
}

int main()
{
	readfile("youdao.in"),writefile("youdao.out");
	init();
	return 0;
}