HDU 1237 前缀树

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <stack>
#define M 50100

using namespace std;

typedef struct Node{
     struct Node *next[27];
     int mark;
}Node;
Node vec[1000];
Node *root;
char str[M][100];
char print[M][100];
int cnt_print;
int cnt;
int cc;
int I;

int cmp(const void *a,const void *b)
{
    return strcmp((char *)a,(char *)b);
}

void Initial()
 {
     int i,j;
     for(i = 0;i < M;i++){
        for(j = 0;j < 27;j++)
          vec[i].next[j] = NULL;
         vec[i].mark = 0;
     }
     cnt = cc = 0;
     cnt_print = 0;
 }

int Bsearch(char *s)
{
    int x,y,m;
    x = 0, y = cnt;
    while(x < y){
        m = x + (y-x)/2;
        if(strcmp(str[m],s) == 0)
         return 1;
        else if(strcmp(str[m],s) > 0)
          y = m;
        else
          x = m+1;
    }
    return 0;
}

void dfs(Node *r,char *s,int cur)
{
    int flage = 0;

    if(r->mark == 2) flage = 1;
    for(int i = 1;i <= 26;i++){
        if(r->next[i] == NULL)
            continue;
        else{
            s[cur] = i + 'a' - 1;
            dfs(r->next[i],s,cur+1);
        }
    }
    if(flage){
        s[cur] = 0;
        if(r->mark != 1)
          if(Bsearch(s)){
            r->mark = 1;
            strcpy(print[cnt_print],str[I]);
            strcat(print[cnt_print],s);
            cnt_print++;
          }
    }
}

void trie_built(char *s)
{
     Node *r = root;
     int t,len,flage;
     len = strlen(s);
     for(int i = 0;i < len;i++){
         t = s[i] - 'a' + 1;
         if(r->next[t] == NULL)
             r->next[t] = &vec[cc++];
         r = r->next[t];
         if(i == len - 1) r->mark = 2;  //单词结束标志  ,开始时未添加   wa N久

}

void Find(char *s)
{
     Node *r = root;
     int t,len;
     char q[100];
     len = strlen(s);
     for(int i = 0;i < len;i++){
         t = s[i] - 'a' + 1;
         r = r->next[t];
     }
     for(int i = 1;i <= 26;i++){
         if(r->next[i] != NULL){
            q[0] = i + 'a' - 1;
            dfs(r->next[i],q,1);
         }
     }
     return;
}


int main()
{
    //freopen("in.in","r",stdin);
    Initial();
    root = &vec[cc++];
    while(cin>>str[cnt])
    {
         trie_built(str[cnt]);
         cnt++;
    }
    for(I = 0;I < cnt;I++)
        Find(str[I]);
    qsort(print,cnt_print,sizeof(print[0]),cmp);
    for(int i = 0;i < cnt_print;i++)
     cout<<print[i]<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值