HihoCoder1644 : 完美命名的烦恼([Offer收割]编程练习赛37)(有向图的一笔画问题||欧拉路)
描述
程序员常常需要给变量命名、给函数命名、给项目命名、给团队命名…… 好的名字可以大大提高程序员的主观能动性,所以很多程序员在起名时都会陷入纠结和烦恼。
小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)(有向图的一笔画问题||欧拉路)的更多相关文章
- [Offer收割]编程练习赛37
热门号码 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> ...
- HihoCoder1643 : 最少换乘([Offer收割]编程练习赛37)(bfs)
描述 小Ho居住的城市有N条公交车线路,其中第i条线路上有Ki个车站. 某些线路之间会有公共的车站,小Ho可以在这些车站从一条线路换乘到另一条线路. 现在给定N条公交车线路以及两个车站S和E,你能帮助 ...
- HihoCoder1642 : 三角形面积和([Offer收割]编程练习赛37)(求面积)(扫描线||暴力)(占位)
描述 如下图所示,在X轴上方一共有N个等腰直角三角形.这些三角形的斜边与X轴重合,斜边的对顶点坐标是(Xi, Yi). (11,5) (4,4) /\ /\(7,3) \ / \/\/ \ / /\/ ...
- 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. ...
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- [Offer收割]编程练习赛46
[Offer收割]编程练习赛46赛后题解 A.AEIOU 分析
- [Offer收割]编程练习赛36
逃离单身节 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector&g ...
- [Offer收割] 编程练习赛63
题目1 : 命名 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 有两个公司想要合并,第一个公司的名字是一个字符串S,第二个公司的名字是一个字符串T. 合并后的新公司是这样 ...
随机推荐
- STL源代码剖析 容器 stl_vector.h
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie vector --------------------------------------- ...
- Struts2学习九----------处理结果类型(input)
© 版权声明:本文为博主原创文章,转载请注明出处 Struts2处理结果类型 - SUCCESS:Action正确的执行完成,返回相应的视图,success是name属性的默认值 - ERROR:表示 ...
- MySql(六):影响 MySQL Server 性能的相关因素
MySQL 最多的使用场景是WEB 应用,那么我们就以一个WEB 应用系统为例,逐个分析其系统构成,进行经验总结,分析出数据库应用系统中各个环境对性能的影响. 一.商业需求对性能的影响 这里我们就拿一 ...
- Angular+Angular-Ui实现分页(代码更加简单,更加容易懂哦)
前面写了个分页,但是个人认为只能玩玩,实际业务上的话代码太繁杂(笔者想走代码.性能精简化之路[不知道哪天才能成为高手~·YY一下无伤大雅]),逻辑上有点混乱.那么今天我们来看看另外一种只实现分页没有查 ...
- JVM完全指南
JVM完全指南 一:虚拟机内存图解 JAVA程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理内存数 ...
- Option可选值可选值(二)
//: Playground - noun: a place where people can play import Cocoa var str1 = "供选链接和强制拆包的不同. &qu ...
- Android之——卸载应用程序
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47357729 不多说,不废话,直接上代码,大家都懂得 //卸载应用程序 //參数为 ...
- POJ 2965:The Pilots Brothers' refrigerator
id=2965">The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total S ...
- Android Studio .9图片的应用以及制作
参考http://www.jianshu.com/p/761f4d0e5d8d 先找到图片右键 然后修改图片名称,选择目录,注意必须要放在drawable目录里面,不然引用studio会报错 然后进入 ...
- Git 自己的一些工作中的总结
这个网址很重要:https://gitee.com/progit/2-Git-%E5%9F%BA%E7%A1%80.html#2.4-%E6%92%A4%E6%B6%88%E6%93%8D%E4%BD ...