洛谷P1127-词链
Accept: 256 Submit: 1.3k
Time Limit: 1000 mSec Memory Limit : 128MB
Problem Description
如果单词 XXX 的末字母与单词 YYY 的首字母相同,则 XXX 与 YYY 可以相连成 X.YX.YX.Y 。(注意: XXX 、 YYY 之间是英文的句号“.”)。例如,单词dog与单词gopher,则dog与gopher可以相连成dog.gopher。
另外还有一些例子:
dog.gopher
gopher.rat
rat.tiger
aloha.aloha
arachnid.dog
连接成的词可以与其他单词相连,组成更长的词链,例如:
aloha.arachnid.dog.gopher.rat.tiger
注意到,“.”两边的字母一定是相同的。
现在给你一些单词,请你找到字典序最小的词链,使得这些单词在词链中出现且仅出现一次。
Input
第一行是一个正整数 n(1≤n≤1000),代表单词数量。
接下来共有 n行,每行是一个由 1到 20 个小写字母组成的单词
Output
只有一行,表示组成字典序最小的词链,若不存在则只输出三个星号“ ∗∗∗”
Sample Input
aloha
arachnid
dog
gopher
rat
tiger
Sample Output
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <stack>
#include <algorithm>
using namespace std; const int maxn = +;
const int maxm = maxn*maxn; int n,tot,head[maxn];
int len[maxn];
bool vis[maxn];
string str[maxn]; struct Edge{
int to,next;
Edge(int to = ,int next = ) : to(to),next(next) {}
}edge[maxm<<]; void AddEdge(int u,int v){
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
} int top,sta[maxn<<]; void output(){
cout << str[sta[]];
for(int i = ;i <= n;i++){
printf(".");
cout << str[sta[i]];
}
cout << endl;
exit();
} void dfs(int u){
vis[u] = true;
sta[++top] = u;
for(int i = head[u];i != -;i = edge[i].next){
int v = edge[i].to;
if(!vis[v]) dfs(v);
}
if(top == n) output();
vis[u] = false;
top--;
} const int kind = ;
int con[maxn]; int main()
{
//freopen("input.txt","r",stdin);
cin >> n;
for(int i = ;i <= n;i++){
cin >> str[i];
}
sort(str+,str++n);
top = ;
memset(head,-,sizeof(head));
memset(vis,false,sizeof(vis));
memset(con,,sizeof(con));
for(int i = ;i <= n;i++){
len[i] = str[i].size();
}
for(int i = ;i <= n;i++){
for(int j = n;j >= ;j--){
if(i!=j && str[i][len[i]-] == str[j][]){
AddEdge(i,j);
}
}
}
for(int i = ;i <= n;i++){
con[str[i][]-'a']++;
con[str[i][len[i]-]-'a']--;
}
int head = -,cnt = ,_cnt = ;
for(int i = ;i < kind;i++){
if(con[i] == ){
head = i;
cnt++;
}
else if(con[i] == -){
_cnt++;
}
}
if(cnt== && _cnt==){
for(int i = ;i <= n;i++){
dfs(i);
}
}
else if(cnt== && _cnt==){
for(int i = ;i <= n;i++){
if(str[i][]-'a' == head) dfs(i);
}
}
printf("***\n");
return ;
}
洛谷P1127-词链的更多相关文章
- P1127 词链
P1127 词链 题目描述 如果单词X的末字母与单词Y的首字母相同,则X与Y可以相连成X.Y.(注意:X.Y之间是英文的句号“.”).例如,单词dog与单词gopher,则dog与gopher可以相连 ...
- 【算法学习】【洛谷】树链剖分 & P3384 【模板】树链剖分 P2146 软件包管理器
刚学的好玩算法,AC2题,非常开心. 其实很早就有教过,以前以为很难就没有学,现在发现其实很简单也很有用. 更重要的是我很好调试,两题都是几乎一遍过的. 介绍树链剖分前,先确保已经学会以下基本技巧: ...
- 洛谷P3384 树链剖分
如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x ...
- 洛谷 P3384 树链剖分(模板题)
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- 【树链剖分】洛谷P3379 树链剖分求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 洛谷 4115 Qtree4——链分治
题目:https://www.luogu.org/problemnew/show/P4115 论文:https://wenku.baidu.com/view/1bc2e4ea172ded630b1cb ...
- 洛谷P2146 树链剖分
题意 思路:直接树链剖分,用线段树维护即可,算是树剖的经典题目吧. 代码: #include <bits/stdc++.h> #define ls(x) (x << 1) #d ...
- 洛谷 [P3384] 树链剖分 模版
支持各种数据结构上树,注意取膜. #include <iostream> #include <cstring> #include <algorithm> #incl ...
- 洛谷 P3384树链剖分 题解
题面 挺好的一道树剖模板: 首先要学会最模板的树剖: 然后这道题要注意几个细节: 初始化时,seg[0]=1,seg[root]=1,top[root]=root,rev[1]=root; 在线段树上 ...
- 树链剖分详解(洛谷模板 P3384)
洛谷·[模板]树链剖分 写在前面 首先,在学树链剖分之前最好先把 LCA.树形DP.DFS序 这三个知识点学了 emm还有必备的 链式前向星.线段树 也要先学了. 如果这三个知识点没掌握好的话,树链剖 ...
随机推荐
- eclipse编写js代码没有提示
安装插件 点击Help,选择Eclipse Marketplace... 搜索js,安装AngularJS Eclipse 重启eclipse,右键项目,选择Configure(配置),选择Conve ...
- Math.max()/min()
返回一组数中最大值: 找到数组中的最大值,有两种方法,一种是apply,一种使用拓展运算符. 释义: 由于max()里面参数不能为数组,所以借助apply(funtion,args)方法调用Math. ...
- js 金额补全处理
function returnFloat(value) { var value = Math.round(parseFloat(value) * 100) / 100; var xsd = value ...
- js 判断数组中是否有重复值
function arrHasvalue(arr) { var nary = arr.sort(); for (var i = 0; i < arr.length; i++) { if (nar ...
- JS中sort()方法的用法,参数以及排序原理
sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字符串Unicode码点.语法:arrayObject.sort(sortby):参数sortby可选.规定排序顺序.必须是函 ...
- 2018-06-20 中文代码示例视频演示Python入门教程第三章 简介Python
知乎原链 Python 3.6.5官方入门教程中示例代码汉化后演示 对应在线文档: 3. An Informal Introduction to Python 不知如何合集, 请指教. 中文代码示例P ...
- 2018-01-02 JavaScript实现ZLOGO: 用语法树实现多层循环
原址: https://zhuanlan.zhihu.com/p/32571516 照例先上演示弱效果图. 演示地址照旧: 代码如下: 开始 循环4次 循环4次 前进50 左转90度 到此为止 右转9 ...
- 【20190223】HTTP-知识点整理:HTTPS
HTTPS:添加了加密及认证机制的HTTP HTTPS 并非是应用层的一种新协议.只是 HTTP 通信接口部分用SSL(Secure Socket Layer)和 TLS(Transport Laye ...
- 数据库连接池(基于MySQL数据库)
使用JDBC是怎么保证数据库客户端和数据库服务端进行连接的? 通过代码: conn=DriverManager.getConnection(url, username, password); JDBC ...
- JMeter http(s)请求插件jmeter-plugin-httpBinaryFileUpload.jar
JMeter http(s)请求插件jmeter-plugin-httpBinaryFileUpload.jar by:授客 QQ:1033553122 1. 测试环境 apache-jmeter ...