Word rings
Word rings
题目描述
这道题就是想求出所有的环,然后在所有环中比较出环串的平均长度最长的那一个,然后就输出平均长度最长的,如果在一个点当中的样例中没有环的话我们就应该输出“No Sulution.”
- 注意是No Sulution. 有句点,题目的翻译有一点问题在测试中数据有句点,在原文中也有句点
首先我们的思路应该是跑最长路,因为无论我们想求平均长度最长,我们肯定希望每一个都非常长,刚好边权为字符串长度,那么跑一下当正环出来之后就跑不出来了。但是这题数据太大了我们过不了
当我们首先用枚举环来求出答案士失败时那么我们接下来的思路应该是尝试枚举答案,然后求出是否有满足答案的环,但若我们此时枚举的答案为ans,有k个字符串,那么就有了这样一个式子ans∗k=len1+len2+len3+...+lenkans∗k=len1+len2+len3+...+lenk
在我们得到那道这个式子之后,我们对它进行必要的移项
len1−ans+len2−ans+len3−ans+...+lenk−ans=0
所以说我们可以得到对于满足以下式子,也可以判断是否是正环
0≤len1−ans+len2−ans+len3−ans+...+lenk−ans0
那么对于这个ans值,ans值越大,那么存在正环的概率也就越小,当ans值越小时,ans大的情况肯定也会包含在里面,这就保证了单调性,我们在确定这个方法的单调性之后我们就可以直接使用二分答案来做这道题了。
对于最长路的求解我们应该使用Dijkstra对此进行判断正环(因为Dijkstra不能处理负数情况,时间的复杂度比较低),但是我们也可以用SPFA来判正环(我们可以将每一条边的权值乘以负一),然后我们再加一个spfa优化就可以了。
补充
在这里讲一下如何进行缩点,在题目中我们不难发现对于一串字符串来说只有首尾的各两个数字是有用的,其他的字符我们可以忽略不计,但是我们学要用一下哈希来使我们的aa到zz中间的所有的字符不会冲突,(第一位可以乘以26,第二位用1到25表示,那么我们得到的那个数整除26的和然后再+1就代表第一个字符在a到z中的第几个位置,之后我们可以再用那个数模26然后再+1就代表第二个字符在a到z中的第几个位置)这样可以保证不会出现冲突了。
直接把一个字符串当中的首尾各两个字符变为两个点整个字符串的长度为我们的边权建立一条边这样就可以进行建边了,再执行之前的工作就可以work it out(解决)了
好题推荐
(spfa的优化的题目)
这些题可以帮助大家练习好spfa的优化的题目
代码
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
const double eps=1e-6;
int n;
char s[1005];
int ord(char a,char b) {//缩点(避免冲突)
return (a-'a')*26+b-'a';
}
int lnk[N],ne[N],la[N],co[N],tot;
double dis[N];
bool vis[N];
void add(int x,int y,int z) {
ne[++tot]=y;
co[tot]=z;
la[tot]=lnk[x];
lnk[x]=tot;
}
bool dfs(int x,double v) {//dfs版的spfa
vis[x]=1;
for(int j=lnk[x]; j; j=la[j]) {
if(dis[ne[j]]<dis[x]+co[j]-v) {
dis[ne[j]]=dis[x]+co[j]-v;
if(vis[ne[j]])return 1;
else {
if(dfs(ne[j],v))return 1;
}
}
}
vis[x]=0;
return 0;
}
bool check(double mid) {//判断是否是负环
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
for(int i=0; i<=5000; ++i)
if(dfs(i,mid))return 1;
return 0;
}
int main() {
while(cin>>n) {
memset(lnk,0,sizeof(lnk));
tot=0;
if(n==0){
return 0;
}
for(int i=1; i<=n; ++i) {
scanf("%s",s+1);
int l=strlen(s+1);
add(ord(s[1],s[2]),ord(s[l-1],s[l]),l);
}
double l=0,r=1005;
while(r-l>eps) {//进行二分答案求解
double mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
if(l==0)cout<<"No solution."<<endl;
else cout<<l<<endl;
}
}
Word rings的更多相关文章
- 【POJ2949】Word Rings(最大平均值环)
题意:给定N个字符串,如果A串的最后两个字母跟B串的前两个字母相同它们就能连接. 求一个由字符串组成的首尾相连的环,使(字符串总长度/字符串个数)最大. n<=100000 len<=10 ...
- 【转】最短路&差分约束题集
转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...
- ACM一些题目
Low Power 先二分答案,可以通过调整证明同一台机器选的两个芯片必然是提供能量数值相邻的两个.所以再贪心一下就可以了. 时间复杂度\(O(n \log n)\). Factors 假设\(k\) ...
- loj题目总览
--DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...
- 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目
目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- 转载 - 最短路&差分约束题集
出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★ ...
- Word/Excel 在线预览
前言 近日项目中做到一个功能,需要上传附件后能够在线预览.之前也没做过这类似的,于是乎就查找了相关资料,.net实现Office文件预览大概有这几种方式: ① 使用Microsoft的Office组件 ...
随机推荐
- 焦大:以后seo排名核心是用户需求点的挖掘
http://www.wocaoseo.com/thread-61-1-1.html 给我一个用户需求点,我便能拗动任何seo排名.-焦大 前不久我看博客上有人留言咨询能否做seo这个词的排名,对于这 ...
- 获取访问的ip地址
最近有一个这样的需求:{ 内网没有访问互联网的权限(没网) 内网:访问链接地址,跳转http://www.123.com 外网:访问链接地址,跳转http;//www.456.com } 在网上看到一 ...
- 力扣Leetcode 55. 跳跃游戏
跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...
- 基于Log4Net记录日志到SQLServer(自定义字段)
本文记录通过log4net将日志信息记录到SQLServer数据库中. 1.新建控制台应用程序 Log4NetDemo: 2.通过NuGet安装Log4Net (项目版本2.0.8): 3.项目根目录 ...
- android开发之dip,dp与px像素之间的转换工具,可能用的不多,但是有总比没有好吧。
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处. 下面是介绍: 免积分下载地址:http://download.csdn.net/de ...
- 程序员软件开发最好的IDE集成工具eclipse各个版本的详细介绍。详细介绍,送给初学者的朋友
对于刚接触软件开发的初学者,在下载eclipse时,对官网上面提供的各种版本的选择犹豫不决.下面将对常用的几个版本进行介绍. Eclipse版本 Eclipse Standard 该版本是eclips ...
- 文本三剑客之sed的用法
第1章 Sed命令 1.1 sed 命令执行过程 1.2 sed介绍 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(p ...
- vue 实现原理及简单示例实现
目录 相关html代码,用于被解析绑定数据 observer代码 Dep代码 Watcher 代码 Compile 代码 vue 简要构造函数 创建vue实例 结语 主要理解.实现如下方法: Obse ...
- 【小白学PyTorch】9 tensor数据结构与存储结构
文章来自微信公众号[机器学习炼丹术]. 上一节课,讲解了MNIST图像分类的一个小实战,现在我们继续深入学习一下pytorch的一些有的没的的小知识来作为只是储备. 参考目录: @ 目录 1 pyto ...
- elasticsearch跨集群数据迁移
写这篇文章,主要是目前公司要把ES从2.4.1升级到最新版本7.8,不过现在是7.9了,官方的文档:https://www.elastic.co/guide/en/elasticsearch/refe ...