Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1517434
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2010-07-27 17:06:02

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int N = 10000*20 + 10;  //单词个*长度+多开几个空间
struct NODE
{
  int flag;  //标记一个单词是否存在
  int son[26];
}trie[N];
int total = 1; //树的长度
void init()
{
 memset(trie,0xff,sizeof(trie));
}
void insert(char* str)
{
 int p=0,k=0;
 while(str[k])
 {
   int v=str[k]-'a';
   if(trie[p].son[v]==-1)
    trie[p].son[v]=total++;  //mempool
   p=trie[p].son[v];
   k++;
 }
 trie[p].flag=1;
}
int cur;  //控制输出单词个数
char ans[50];
void dfs(int k,int p)
{
 if(cur>=8)  return;
 if(trie[p].flag!=-1)  //单词存在
 {
   ans[k]=0;  //'\0'
   if(cur==0) printf("%s",ans);
   else   printf(" %s",ans);
   cur++;
 }
 for(int i=0;i<26;++i)
 {
   if(trie[p].son[i]!=-1)
   {
     ans[k] = i +'a';
     dfs(k+1,trie[p].son[i]);
   }
 }
 return ;
}
void find(char* str)
{
 int p=0,k=0;
 while(str[k] && p!=-1)
 {
   p = trie[p].son[str[k]-'a'];
   k++;
 }
 if(p==-1) //str这个没出现过,短路
 {
   printf("%s\n",str);
   return;
 }
 cur = 0;
 for(int i=0;i   ans[i]=str[i];
 dfs(k,p);
 printf("\n");
}
int main()
{
 #ifdef LOCAL
 freopen("data.in","r",stdin);
 freopen("data.out","w",stdout);
 #endif
 
 init();
 int i,n;
 char str[50];
 scanf("%d",&n);
 for(i=0;i {
  scanf("%s",str);
  insert(str);
 }
 int q;
 scanf("%d",&q);
 while(q--)
 {
   scanf("%s",str);
   find(str);
 }
 return 0;
}
阅读(818) | 评论(0) | 转发(0) |
0

上一篇:1054

下一篇:1925

给主人留下些什么吧!~~