POJ 2001 Shortest Prefix

字典树基本题。

 

代码:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <algorithm>

#include <cstdlib>



using namespace std;

#define N 1027



struct node

{

    int count;

    node *next[30];

}*root;



char ss[N][30];



node *create()

{

    node *p;

    p = (node *)malloc(sizeof(node));

    p->count = 1;

    for(int i=0;i<26;i++)

        p->next[i] = NULL;

    return p;

}



void release(node *p)

{

    for(int i=0;i<26;i++)

    {

        if(p->next[i] != NULL)

            release(p->next[i]);

    }

    free(p);

}



void insert(char *ss)

{

    int i=0,k;

    node *p = root;

    while(ss[i])

    {

        k = ss[i++] - 'a';

        if(p->next[k] == NULL)

            p->next[k] = create();

        else

            p->next[k]->count++;

        p = p->next[k];

    }

}



void search(char *ss)

{

    int i = 0,k,j,flag = 0;

    node *p = root;

    while(ss[i] && !flag)

    {

        k = ss[i++] - 'a';

        p = p->next[k];

        if(p->count == 1)

        {

            flag = 1;

            printf("%s ",ss);

            for(j=0;j<i;j++)

                printf("%c",ss[j]);

            printf("\n");

        }

    }

    if(!flag)

        printf("%s %s\n",ss,ss);

}



int main()

{

    int i=0,j,k;

    root = create();

    while(scanf("%s",ss[i])!=EOF)

    {

        insert(ss[i]);

        i++;

    }

    for(j=0;j<i;j++)

        search(ss[j]);

    release(root);

    return 0;

}
View Code

 

你可能感兴趣的:(test)