Sort Me (字典树)

Sort Me
Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:65536KB
Total submit users: 69, Accepted users: 65
Problem 12946 : No special judgement
Problem description

We know the normal alphabetical order of the English alphabet, and we can then sort words or other letter sequences.  For instance these words are sorted:


ANTLER
ANY
COW
HILL
HOW
HOWEVER
WHATEVER
ZONE

The standard rules for sorting letter sequences are used:
  1. The first letters are in alphabetical  order.
  2. Among strings with the same prefix, like the prefix AN in ANTLER and ANY, they are ordered by the first character that is different, T or Y here. 
  3. One whole string may be a prefix of another string, like HOW and HOWEVER.  In this case the longer sequence comes after the shorter one.

The Gorellians, at the far end of our galaxy, have discovered various samples of English text from our electronic transmissions, but they did not find the order of our alphabet.  Being a very organized and orderly species, they want to have a way of ordering words, even in the strange symbols of English.  Hence they must determine their own order.  Unfortunately they cannot agree, and every Gorellian year, they argue and settle on a new order.


For instance, if they agree on the alphabetical order

UVWXYZNOPQRSTHIJKLMABCDEFG

then the words above would be sorted as


WHATEVER
ZONE
HOW
HOWEVER
HILL
ANY
ANTLER
COW

The first letters of the words are in their alphabetical order.  Where words have the same prefix, the first differing letter determines the order, so the order goes ANY,  then ANTLER, since Y is before T in their choice of alphabet.  Still HOWEVER comes after HOW, since HOW is a prefix of HOWEVER.

Dealing with the different alphabetical orders each year by hand (or tentacle) is tedious.  Your job is to implement sorting with the English letters in a specified sequence.


Input

Input:  The input will contain one or more datasets.  Each dataset will start with a line containing an integer n and a string s, where s is a permutation of the English uppercase alphabet, used as the Gorellians' alphabet in the coming year.  The next n lines (1 ≤ n ≤ 20) will each contain one non-empty string of letters.  The length of each string will be no more than 30.  Following the last dataset is a line containing only 0.


Output

Output: The first line of output of each dataset will contain "year " followed by the number of the dataset, starting from 1.   The remaining n lines are the n input strings sorted assuming the alphabet has the order in s.


Sample Input
8 UVWXYZNOPQRSTHIJKLMABCDEFG
ANTLER
ANY
COW
HILL
HOW
HOWEVER
WHATEVER
ZONE
5 ZYXWVUTSRQPONMLKJIHGFEDCBA
GO
ALL
ACM
TEAMS
GO
10 ZOTFISENWABCDGHJKLMPQRUVXY
THREE
ONE
NINE
FIVE
SEVEN
ZERO
TWO
FOUR
EIGHT
SIX
0
Sample Output
year 1
WHATEVER
ZONE
HOW
HOWEVER
HILL
ANY
ANTLER
COW
year 2
TEAMS
GO
GO
ALL
ACM
year 3
ZERO
ONE
TWO
THREE
FOUR
FIVE
SIX
SEVEN
EIGHT
NINE
Problem Source
ACM Mid-Central Programming Competition 2013

#include<stdio.h>
typedef struct nn
{
    int flag;
    struct nn *next[26];
}node;
node *root;
node *builde()
{
    node *p=new node;
    for(int i=0;i<26;i++)
    p->next[i]=NULL;
    p->flag=0;
    return p;
}
char str[50],s[50];
int Oder[50];
void set()
{
    node *p=root;
    for(int i=0;str[i]!='\0';i++)
    {
        int j=Oder[str[i]-'A'];
        if(p->next[j]==NULL)
        p->next[j]=builde();
        p=p->next[j];
    }
    p->flag++;
}
void print(node *p,int len)
{
    if(p->flag)
    {
        for(int i=1;i<=(p->flag);i++)
        printf("%s\n",str);
    }
    for(int i=0;i<26;i++)
    if(p->next[i]!=NULL)
    {
        str[len]=s[i]; str[len+1]='\0';
        print(p->next[i],len+1);
    }
}
int main()
{
    int t=0,n;
    while(scanf("%d",&n)>0&&n)
    {
        scanf("%s",s);
        for(int i=0;i<26;i++)
        Oder[s[i]-'A']=i;
        root=builde();
        while(n--)
        {
            scanf("%s",str);
            set();
        }
        printf("year %d\n",++t);
        print(root,0);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值