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的更多相关文章

  1. 【POJ2949】Word Rings(最大平均值环)

    题意:给定N个字符串,如果A串的最后两个字母跟B串的前两个字母相同它们就能连接. 求一个由字符串组成的首尾相连的环,使(字符串总长度/字符串个数)最大. n<=100000 len<=10 ...

  2. 【转】最短路&差分约束题集

    转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...

  3. ACM一些题目

    Low Power 先二分答案,可以通过调整证明同一台机器选的两个芯片必然是提供能量数值相邻的两个.所以再贪心一下就可以了. 时间复杂度\(O(n \log n)\). Factors 假设\(k\) ...

  4. loj题目总览

    --DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...

  5. 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目

    目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...

  6. LOJ 一本通一句话题解系列:

    第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...

  7. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  8. 转载 - 最短路&差分约束题集

    出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548    A strange lift基础最短路(或bfs)★ ...

  9. Word/Excel 在线预览

    前言 近日项目中做到一个功能,需要上传附件后能够在线预览.之前也没做过这类似的,于是乎就查找了相关资料,.net实现Office文件预览大概有这几种方式: ① 使用Microsoft的Office组件 ...

随机推荐

  1. MySQL主从同步简单介绍&配置

    介绍: 现在mysql集群基本上都是使用一主多从方式,实现读写分离(主库写.从库读).负载均衡.数据备份,以前只是使用从未配置过,今天简单配置一下! mysql主从复制是通过binary log日志实 ...

  2. python - 平方根格式化 + 字符串分段组合

    题目来源:python123 平方根格式化 描述 获得用户输入的一个整数a,计算a的平方根,保留小数点后3位,并打印输出.‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪ ...

  3. Istio安全-授权(实操三)

    Istio安全-授权 目录 Istio安全-授权 授权HTTP流量 为使用HTTP流量的负载配置访问控制 卸载 授权TCP流量 部署 配置TCP负载的访问控制 卸载 使用JWT进行授权 部署 使用有效 ...

  4. Spring Validation-用注解代替代码参数校验

    Spring Validation 概念 在原先的编码中,我们如果要验证前端传递的参数,一般是在接受到传递过来的参数后,手动在代码中做 if-else 判断,这种编码方式会带来大量冗余代码,十分的不优 ...

  5. oeasy教您玩转linux-010110内容回顾

    我们来回顾一下 我们都讲了什么?

  6. unity 对Animator动画系统的研究

    unity的新动画系统叫Mecanim,使用Animator来取代旧系统Animation,按Unity文档的惯例:知识点主要分2部分:unity manual和unity script,读者可以边看 ...

  7. 【HttpRunner v3.x】笔记 ——5. 测试用例-config

    上一篇中,我们了解到了config,在配置中,我们可以配置测试用例级级别的一些设置,比如基础url.验证.变量.导出. 我们一起来看,官方给出的一个例子: from httprunner import ...

  8. 使用dbUnit的 IDataSet 因乱序造成assert失败而采取的措施

    本例源码下载:https://files.cnblogs.com/files/xiandedanteng/dbUnitTest20200211.zip 在做IDataSet比较时,特殊情况下会有期盼的 ...

  9. Java得到指定日期的时间

    //得到指定日期(几天前/几天后)整数往后推,负数往前移动private Date getAppointDay(int num) throws ParseException { DateFormat ...

  10. leetcode刷题-43字符串相乘

    题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 思路 字符串转数字:从字符串第一位开始取,每次取出的值转换为数字 ...