描述

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

小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. 织梦在广告(myad)中使用css样式

    使用单引号,以及只有style这一个属性

  2. 基于Python的安卓图形锁破解程序

    安卓手机的图形锁是3x3的点阵,按次序连接数个点从而达到锁定/解锁的功能.最少需要连接4个点,最多能连接9个点.网上也有暴力删除手机图形锁的方法,即直接干掉图形锁功能.但假如你想进入别人的手机,但又不 ...

  3. 有关Cache –(1) linux list之中的Prefetc

    转载:http://www.kernelchina.org/node/1050 linux的list实现之中有如下东东: #define list_for_each(pos, head) \     ...

  4. TOML简介 (转)

    TOML的由来 配置文件的使用由来已久,从.ini.XML.JSON.YAML再到TOML,语言的表达能力越来越强,同时书写便捷性也在不断提升. TOML是前GitHub CEO, Tom Prest ...

  5. vagrant 介绍,安装与使用

    可以帮你统一团队成员的开发环境.如果你或者你的伙伴创建了一个Vagrantfile,那么你只需要执行vagrant up就行了,所有的软件都会安装并且配置好.团队成员可以通过相同的Vagrantfil ...

  6. 架构 -- java

    @.sql写在dao层 原文:http://blog.csdn.net/y_dzaichirou/article/details/53673528 @.Java Web项目需要掌握的技能 原文:htt ...

  7. 【Atheros】禁用CSMA之后pktgen发包一分钟后无法发送的问题

    无线网络中各个节点不断地广播信标帧,收到某节点的信标帧之后才知道这个节点存在,知道它的网络配置是怎么样的,才能知道应该怎么和它通信. 那么问题来了,禁用了CSMA之后,发送节点全力发送,那么它会永远占 ...

  8. Flask,ORM及模板引擎Jinja2

    跨域:http://blog.csdn.net/yannanxiu/article/details/53036508 下载flask_cors包 pip install flask-cors 使用fl ...

  9. _THROW 何解?

    在看/usr/include/........中.h头文件对函数接口的定义时,总是能看到在函数结尾加一个_THROW,一时不明白这是什么意思,而且对于有些POSIX和ISO C不承认或未明确的定义的函 ...

  10. 【BZOJ4238】电压 DFS树

    [BZOJ4238]电压 Description 你知道Just Odd Inventions社吗?这个公司的业务是“只不过是奇妙的发明(Just Odd Inventions)”.这里简称为JOI社 ...