UVaOJ10602 - Editor Nottoobad

10602 - Editor Nottoobad

Time limit: 3.000 seconds

Company Macrohard has released it’s new version of editor Nottoobad, which can understand a few voice commands. Unfortunately, there are only two voice commands that it can understand – “repeat the last word”, “delete the last symbol”. However, when one uses “repeat the last word” the editor inserts a blank that separates the words. But the company claims that it is possible to type much faster – simply by less number of presses. For example, such a phrase like “this thin thing” requires only 6 presses of the keyboard.

 

Action

Number

of presses

Content of the document

Press "this"

4

This

Say “repeat the last word”

0

this this

Say “delete the last symbol”

0

this thi

Press "n"

1

this thin

Say “repeat the last word”

0

this thin thin

Press "g"

1

this thin thing

 

In order to increase the popularity of it’s product the company decided to organize a contest where the winner will be a person who types a given number of words with minimum number of presses. Moreover, the first word must be typed first, and all the others can be typed in arbitrary order. So, if words “apple”, “plum” and “apricote” must be typed, the word “apple” must be typed first, and the words “plum” and “apricote” can be switched. And the most important for you – you are going to take part in the contest and you have a good friend in the company, who told you the word which will be used in the contest. You want be a winner J, so you have to write a program which finds the order of the words, where the number of presses will be minimum.

 

Input

The first line of the input contains the T (1≤T≤15) the number of test cases. Then T test cases follow. The first line of each test contains a number N (1≤N≤100) – the number of words that must be pressed. Next N lines contain words – sequences of small Latin letters, not longer than 100 symbols. Remember that the first word must be pressed first!

 

Output

The first line of the output contains number X - the minimum number of presses, which one has to do in order to type all the words using editor Nottoobad. Next N lines contain the words in that minimum order. If there are several solutions, you can output one of them.

 

 

 

 

 

Sample Input

Sample Output

3

3

this

thin

thing

4

popcorn

apple

apricote

plum

2

hello

hello

6

this

thin

thing

21

popcorn

plum

apricote

apple

5

hello

hello

 

Problem source: Russian National Team Olympiad 2000

Problem author: Andrew Stankevich

Problem translation: Dmytro Chernysh

Problem solution: Andrew Stankevich, Dmytro Chernysh


#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cstring>
#define MAXN 120
using namespace std;

struct Node{
    int no;
    char word[110];
    friend bool operator < (const Node &a, const Node &b){
        return a.no < b.no;
    }
}arr[MAXN];


int main(){
    int T, N;
    char str[110];
    scanf("%d", &T);
    while(T--){
        scanf("%d",&N);
        for(int i=0; i<N; ++i){
            scanf("%s",arr[i].word);
            arr[i].no = -1;
        }
        arr[0].no = 1;
        int ans=strlen(arr[0].word);
        int rank=1, last=0;

        while(rank < N){
            int t=-1, cnt=0;
            for(int i=0; i<N; ++i)if(arr[i].no==-1){
                if(t==-1){
                    t=i;
                    if(arr[i].word[0]==arr[last].word[0]){
                        for(int j=0; j<strlen(arr[i].word)&&j<strlen(arr[last].word); ++j){
                            if(arr[i].word[j]!=arr[last].word[j]) break;
                            else ++cnt;
                        }
                    }
                }
                else{
                    int tmp=0;
                    for(int j=0; j<strlen(arr[i].word)&&j<strlen(arr[last].word); ++j){
                        if(arr[i].word[j]!=arr[last].word[j]) break;
                        else ++tmp;
                    }
                    if(tmp > cnt){
                        t=i; cnt=tmp;
                    }
                }
            }
            ans += (strlen(arr[t].word) - cnt);
            arr[t].no = rank++;
            last = t;
        }
        sort(arr, arr+N);
        printf("%d\n", ans);
        for(int i=0; i<N; ++i)
            puts(arr[i].word);
    }
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值