描述

程序员常常需要给变量命名、给函数命名、给项目命名、给团队命名…… 好的名字可以大大提高程序员的主观能动性,所以很多程序员在起名时都会陷入纠结和烦恼。

小Hi希望给新的项目起个完美的名字。首先小Hi给出了新项目的N个长度相等(均为L)的关键字,他希望能找到一个完美名字:这个名字的长度恰好为N+L-1,并且其中N个长度为L的子串恰好是给定的N个关键字。

例如对于关键字cat、ate、tea有完美的名字:catea。

给定N个长度相等的关键字,请你帮小Hi找到一个完美的名字。

输入

第一行包含一个整数N。

以下N行每行包含一个长度为L的关键字。

对于30%的数据,1 ≤ N ≤ 10

对于100%的数据,1 ≤ N ≤ 50000,1 ≤ L ≤ 10,关键字只包含小写字母。

输出

如果存在完美的名字,你可以输出任意一个。如果不存在,输出NO。

样例输入

3
ate
cat
tea

样例输出

catea

 模型:成语接龙。

以前做过类似的题,有所灵感,知道怎么建图。

  • 如单词abcd,我们加一条有向边abc->bcd,
  • 那么ate,cat,tea,就是有边at->te, ca->at, te->ea。那么一笔画就是ca->at->te-ea,得到catea。

做完的感触。

  • 真的是wa了好久,主要是没有考虑只有一个字母长度的情况(毕竟代码里有‘L-2’这个东西)
  • 注意‘NO’的情况,如果不能连通;如果连通了但是不满足欧拉路的条件(无奇点,或一个起点一个终点)
  • 逆序输出。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
const int maxn=;
map<string,int>mp;
map<int,string>name;
char c[];string s1,s2;
int Laxt[maxn],Next[maxn],To[maxn],cnt,tot,num;//边,点,路
int id[maxn],od[maxn],used[maxn],path[maxn];
int a[maxn],b[maxn];//起点;
void add(int u,int v)
{
Next[++cnt]=Laxt[u];
Laxt[u]=cnt;
To[cnt]=v;
}
void dfs(int u) //Fluery算法
{
for(int i=Laxt[u];i;i=Next[i]){
if(!used[i]){
used[i]=;
dfs(To[i]);
}
}
path[++num]=u;
}
int main()
{
int n,i,j,L;bool Flag=false;
scanf("%d",&n);
for(i=;i<=n;i++){
scanf("%s",c);
L=strlen(c);
if(L==){
cout<<c[];
Flag=true;
}
s1=s2="";
for(j=;j<L-;j++)s1+=c[j];
for(j=;j<L;j++) s2+=c[j];
if(mp.find(s1)==mp.end()) mp[s1]=++tot,name[tot]=s1;
if(mp.find(s2)==mp.end()) mp[s2]=++tot,name[tot]=s2;
a[i]=mp[s1];b[i]=mp[s2];
od[a[i]]++;id[b[i]]++;
add(a[i],b[i]);
}
if(Flag) { cout<<endl;return ;} //只有单个字母,坑了我好久
int S=,c1=,c2=;
for(i=;i<=tot;i++){
if(od[i]-id[i]==) c1++,S=i;
else if(od[i]-id[i]==-) c2++;
else if(od[i]-id[i]!=) c1=;
}
if(!((c1==&&c2==)||(c1==&&c2==))) cout<<"NO"<<endl;//不满足欧拉路
else{
dfs(S);
if(num!=n+) cout<<"NO"<<endl; //不连通(也可以用并查集做)
else {
cout<<name[S];
for(i=num-;i>=;i--) cout<<name[path[i]][L-];
}
}
return ;
}

HihoCoder1644 : 完美命名的烦恼([Offer收割]编程练习赛37)(有向图的一笔画问题||欧拉路)的更多相关文章

  1. [Offer收割]编程练习赛37

    热门号码 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> ...

  2. HihoCoder1643 : 最少换乘([Offer收割]编程练习赛37)(bfs)

    描述 小Ho居住的城市有N条公交车线路,其中第i条线路上有Ki个车站. 某些线路之间会有公共的车站,小Ho可以在这些车站从一条线路换乘到另一条线路. 现在给定N条公交车线路以及两个车站S和E,你能帮助 ...

  3. HihoCoder1642 : 三角形面积和([Offer收割]编程练习赛37)(求面积)(扫描线||暴力)(占位)

    描述 如下图所示,在X轴上方一共有N个等腰直角三角形.这些三角形的斜边与X轴重合,斜边的对顶点坐标是(Xi, Yi). (11,5) (4,4) /\ /\(7,3) \ / \/\/ \ / /\/ ...

  4. HihoCoder1641 : 热门号码([Offer收割]编程练习赛37)(模拟)

    描述 1 2 3 ABC DEF 4 5 6 GHI JKL MNO 7 8 9 PQRS TUV WXYZ * 0 # 我们知道电话拨号盘上数字会有若干字母对应,例如2对应ABC,7对应PQRS. ...

  5. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  6. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  7. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

  8. [Offer收割]编程练习赛36

    逃离单身节 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector&g ...

  9. [Offer收割] 编程练习赛63

    题目1 : 命名 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 有两个公司想要合并,第一个公司的名字是一个字符串S,第二个公司的名字是一个字符串T. 合并后的新公司是这样 ...

随机推荐

  1. SpringMVC请求流程与原理分析

    SpringMVC的工作原理图: SpringMVC流程 1.  用户发送请求至前端控制器DispatcherServlet. 2.  DispatcherServlet收到请求调用HandlerMa ...

  2. log4j:WARN Please initialize the log4j system properly.

    在tomcat启动的时候,出现这个警告: log4j:WARN No appenders could be found for logger (org.apache.commons.digester. ...

  3. 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  4. 巧用Excel提高工作效率

    程序员如何巧用Excel提高工作效率 主要讲解下Excel中VLOOKUP函数的使用,相比于上一篇中的内容,个人觉得这个相对高级一些. 1.使用背景 为什么会使用到这个函数呢,背景是这样的,有两个系统 ...

  5. js关于变量作为if条件的真假问题

    var a = ""; if(a){ ..... }else{ .....} 以下情况会被认为返回false: "" 空的字符串 为 0 的数字 为 null ...

  6. MongoDB--安装部署

    MongoDB安装 说明: 本次安装教程: 版本:mongoDB-3.2.4 安装环境:windows 10 ,64位操作系统 准备:安装包.Robomongo(客户端用于查看mongoDB里面的数据 ...

  7. 【转】windows下 ADT NDK开发环境配置

    前提: 下载好Ecplise ADT并配置好开发环境,不会配置环境可以参考这里: http://blog.csdn.net/danfengw/article/details/47111107 步骤: ...

  8. php生成唯一的串

    1.方法一: <?php md5(uniqid('aa',true)); ?> 2.方法2: //生成16位的串$randLength=6; $chars='abcdefghijklmno ...

  9. python 基础 4.3 高阶函数下和匿名函数

    一 .匿名函数 顾名思议就是没有名字的函数,那为什么要设立匿名函数,他有什么作用呢?lambda 函数就是一种快速定义单行的最小函数,可以用在任何需要函数的地方.   常规版: def fun(x,y ...

  10. 九度OJ 1070:今年的第几天? (日期计算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4833 解决:2716 题目描述: 输入年.月.日,计算该天是本年的第几天. 输入: 包括三个整数年(1<=Y<=3000).月 ...