poj 2237(Catenyms)

来源:互联网 发布:超级基因优化液压缩 编辑:程序博客网 时间:2024/06/16 08:14
 

这道题是,欧拉路和并查集结合起来的一道很恶心的题,最主要的难点在于,将这个模型抽象为欧拉路,已经应该用怎么样的存储方式。还有代码长了过后,变量的赋值一定要特别小心啊,我就是在一个地方把begin = i写成了begin - a; 于是就浪费了我好几个小时呢

Catenyms
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 5806 Accepted: 1503

Description

A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For example, the following are catenyms:
dog.gophergopher.ratrat.tigeraloha.alohaarachnid.dog

A compound catenym is a sequence of three or more words separated by periods such that each adjacent pair of words forms a catenym. For example,

aloha.aloha.arachnid.dog.gopher.rat.tiger

Given a dictionary of lower case words, you are to find a compound catenym that contains each of the words exactly once.

Input

The first line of standard input contains t, the number of test cases. Each test case begins with 3 <= n <= 1000 - the number of words in the dictionary. n distinct dictionary words follow; each word is a string of between 1 and 20 lowercase letters on a line by itself.

Output

For each test case, output a line giving the lexicographically least compound catenym that contains each dictionary word exactly once. Output "***" if there is no solution.

Sample Input

26alohaarachniddoggopherrattiger3oakmapleelm

Sample Output

aloha.arachnid.dog.gopher.rat.tiger***

Source

Waterloo local 2003.01.25

源代码:

#include<cstdio>#include<cstring>#include<string>#include<cstdio>#include<algorithm>#define MAXN  1010#define len 30using namespace std;char str[MAXN][len];char str1[MAXN][len];int father[len], n, changdu;struct orer{    int from, to, visit;}oulaa[MAXN];int cmp(const void *a, const void *b){    return strcmp((char *)a, (char *)b);}int find(int x){    int i,j;    i = x;    while(x != father[x])  x = father[x];    while(i != x){//完成状态压缩        j = father[i];        father[i] = x;        i = j;    }    return x;}void merge(int a, int b){    int x = find(a);    int y = find(b);    father[x] = y;}void eurlar(int start,int size){for(int i=1;i<=size;i++){if(!oulaa[i].visit && oulaa[i].from==start){oulaa[i].visit = 1;eurlar(oulaa[i].to, size);strcpy(str1[++changdu],str[i]);}}}int main(){    int t, in_out,a, b,begin, flag, in[len], out[len], used[len];    scanf("%d", &t);    while(t--){        //printf("t : %d\n", t);        memset(in,0,sizeof(in));        memset(out,0,sizeof(out));        memset(used, 0, sizeof(used));        scanf("%d", &n);        if(n<3){printf("***");printf("\n");continue;}        in_out = 0;        for(int i = 1; i <= n; i++){            scanf("%s", str[i]);        }        for(int i = 1; i <= 26; i++){            father[i] = i;        }        qsort(str+1, n, sizeof(str[0]), cmp);        for(int i = 1; i <= n; i++){            a = str[i][0] - 'a' + 1;            b = str[i][strlen(str[i]) - 1] - 'a' + 1;            oulaa[i].from = a;            oulaa[i].to = b;            oulaa[i].visit = 0;            in[b]++;            out[a]++;            merge(a,b);            used[a] = 1;            used[b] = 1;        }        /*        for(int  i = 1; i <= 26; i++){            if(in[i] != out[i])                in_out++;        }        if(in_out > 2){            printf("***\n");            continue;        }*/        a = 0;        b = 0;        for(int i = 1; i<= 26; i++){            if(father[i] == i && used[i])                b++;        }        if(b > 1){            printf("***\n");            continue;        }        a = 0,b = 0,flag = 0;        for(int i = 1; i <= 26; i++){            if(in[i] == out[i])  continue;            else if(in[i] - 1 == out[i])  a++;            else if(in[i] + 1 == out[i])  b++;            else {                flag = 1;                break;            }        }        if(flag == 1 || a > 1 || b > 1 || a != b){            printf("***\n");            continue;        }        begin = 1;        changdu = 0;        if(a == 1){            for(int i = 1; i <= n;i++){                if(out[oulaa[i].from] - in[oulaa[i].from] == 1){                    begin = i;                    break;                }            }        }        eurlar(oulaa[begin].from, n);        for(int i = changdu; i > 1; i--){            printf("%s.", str1[i]);        }        printf("%s\n", str1[1]);    }    return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 前向运动精子2%怎么办 正常精子形态只有10%怎么办 精子混合畸形率高怎么办 正常形态精子才2怎么办 精子密度低至0.8怎么办 精子总活动率低怎么办 前向运动精子低怎么办 精子畸形率百分之94怎么办 实验室授权签字人考不过怎么办 万和热水器排污口漏水怎么办 万和热水器水箱漏水怎么办 军训鞋大了怎么办妙招 麽稍神经不好受怎么办 绒面高跟鞋太硬怎么办 新买的鞋子太硬怎么办 鞋底太硬脚掌疼怎么办 耐克鞋子走路吱吱响怎么办 两只鞋子有色差怎么办 劳保鞋鞋底太硬怎么办 在学校校服丢了怎么办 高中没进重点班怎么办 孩子不懂学不想学怎么办 孩子小学数学学不懂怎么办 入学籍系统提交了没分班怎么办 被监考老师抓了作弊怎么办 作弊被老师抓到了怎么办? 中考作弊给抓到怎么办 考试作弊证据没得监控怎么办 考试作弊被领导发现了怎么办 黄冈讲课视频看不了怎么办 高中学校不给转学籍怎么办 兴山香溪大酒店欠钱不还怎么办 黑坑青鱼滑口怎么办 不交物业费物业怎么办 车牌刮了一点漆怎么办 电脑光驱线坏了怎么办 做系统不读光驱怎么办 光盘放进电脑没反应怎么办 不服省高院裁定维持原判怎么办 咖啡和酒一起喝怎么办 跟法官联系不上怎么办