描述

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

小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. VueJS自定义全局和局部指令

    除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令. 使用directive自定义全局指令 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面 ...

  2. Android微信分享功能实例+demo

    Android微信分享功能实例 1 微信开放平台注册 2 获得appId,添加到程序中,并运行程序 3 使用应用签名apk生成签名,添加到微信开放平台应用签名,完成注册 4 测试分享功能. 有问题请留 ...

  3. opencl教程

    http://www.altera.com.cn/corporate/news_room/releases/2013/products/nr-opencl-sdk-13.0.html http://w ...

  4. Android OkHttp的Cookie自己主动化管理

    Android中在使用OkHttp这个库的时候.有时候须要持久化Cookie,那么怎么实现呢.OkHttp的内部源代码过于复杂,不进行深究.这里仅仅看当中的HttpEngineer里面的部分源代码,在 ...

  5. 【Atheros】无线网卡驱动性能测试工具pktgen的使用

    前言:从12年开始做无线驱动相关的工作,到13年大概做了一年半,现在歇了快一年了,以免白学那么久,最近重新整理了一下当时的资料,写一点文章,这方面的帖子比较少,当时碰到过很多问题难以解决,我是用的li ...

  6. onscreen and offscreen

    本文来自stackoverflow一位网友的解答,感觉非常不错就摘录了. --------------------------------------------------------------- ...

  7. android -volley-请求数据

    private List<gson.DataBean>arrGson;//请求的数据 //请求数据的方法 public void initData() { RequestQueue mQu ...

  8. 50道JAVA基础编程练习题 - 题目

    50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...

  9. 【BZOJ3696】化合物 树形DP+暴力

    [BZOJ3696]化合物 Description 首长NOI惨跪,于是去念文化课了.现在,他面对一道化学题.    这题的来源是因为在一个奇怪的学校两个化竞党在玩一个奇怪的博弈论游戏.这个游戏很蛋疼 ...

  10. NHibernate学习系列一

    NHibernate是一个面向.NET环境的对象/关系数据库映射工具.对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映 ...