Description

Bsny从字典挑出N个单词,并设计了接龙游戏,只要一个单词的最后两个字母和另一个单词的前两个字母相同,那么这两个单词就可以有序的连接起来。
Bsny想要知道在所给的所有单词中能否按照上述方式接龙组成一个单词环(可能是多个),若能,求所有环的环中单词平均长度最大值。

Input

第一行一个整数N,表示单词数量。
接下来N行,每行一个字符串,仅包含小写字母。

Output

若能组成单词环,输出环中单词的最大平均长度,结果保留2位小数;否则输出”No solution.”(不包括双引号)。精度误差在0.01都算正确。

Sample Input

3
intercommunicational
alkylbenzenesulfonate
tetraiodophenolphthalein

Sample Output

21.67

Data Constraint

20%的数据:n≤20n≤20;
70%的数据:n≤1000n≤1000;
100%的数据:n≤100000n≤100000,每个单词长度不超过1000。输入数据比较大,C/C++的同学用scanf输入。

Solution

  • 把问题转换一下,可以这样处理:

  • 把一个单词的前两个单词和后两个单词视为点,单词长度视为边权

  • 那么点数最多为 26∗26=67626*26=676 个点,这样在其中找环即可

  • 看到题目问的是最大值,那么可以二分答案 lenlen,每一条边权值减去 lenlen,

  • 于是问题变成判定是否存在正权环!有则 lenlen 可以更大,没有则更小。

  • 对于判定环,可以使用 SPFA,BFS和DFS都可以,每个点跑一次最长路即可

  • 详情请见我的博客:http://blog.csdn.net/liyizhixl/article/details/54565085

  • (SPFA算法及判负环方法)

  • 注意走过的点不用再做SPFA,时间复杂度 O(NlogN)O(N log N)

Code

#include<cstdio>
#include<cstring>
using namespace std;
const int N=3000001,M=26*26+1;
const double E=1e-3;
int n,tot;
int node[M],que[N];
double dis[M],w[N];
int first[M],next[N],en[N];
bool bz[M],vis[M];
char s[1002];
inline int get(int x,int y)
{return 26*(x-'a')+y-'a'+1;
}
inline void insert(int x,int y,int z)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;w[tot]=z;
}
inline bool spfa(int st,double num)
{for(int i=1;i<=node[i];i++) dis[node[i]]=0;int l=0,r=1;vis[que[1]=st]=true;while(l<r){int now=que[++l];bz[now]=false;for(int i=first[now];i;i=next[i])if(dis[now]+w[i]-num>dis[en[i]]){dis[en[i]]=dis[now]+w[i]-num;if(!bz[en[i]]){bz[que[++r]=en[i]]=vis[en[i]]=true;if(r>n) return true;}}}return false;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",s+1);int len=strlen(s+1);if(len==1) continue;int x=get(s[1],s[2]),y=get(s[len-1],s[len]);if(x!=y) insert(x,y,len);if(!vis[x]) vis[node[++node[0]]=x]=true;if(!vis[y]) vis[node[++node[0]]=y]=true;}double l=0,r=1000;while(l+E<r){double mid=(l+r)/2;for(int i=1;i<=node[0];i++) vis[node[i]]=false;bool pd=false;for(int i=1;i<=node[0];i++)if(!vis[node[i]] && spfa(node[i],mid)){pd=true;break;}if(pd) l=mid; else r=mid;}if(!l) printf("No solution."); else printf("%.2lf",l);return 0;
}

JZOJ 3852. 【NOIP2014八校联考第2场第2试9.28】单词接龙(words)相关推荐

  1. JZOJ 3853. 【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)

    Description Bsny的书架乱成一团了,帮他一下吧! 他的书架上一共有n本书,我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31,31,32,那么混乱值为3:30, ...

  2. JZOJ 3875. 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)

    Description 在遥远的S星系中一共有N个星球,编号为1-N.其中的一些星球决定组成联盟,以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条 ...

  3. JZOJ 3871. 【NOIP2014八校联考第4场第1试10.19】无聊的游戏(game)

    Description 学校的运动会开始了,体能很菜的小可可没报任何比赛项目,于是和同学们玩一个十分无聊的游戏. 游戏在一个由 n∗nn*n 个方格组成的正方形棋盘上进行,首先在每个方格上均匀随机地填 ...

  4. JZOJ 3870. 【NOIP2014八校联考第4场第1试10.19】单词检索(search)

    Description 小可可是学校图书馆的管理员,现在他接手了一个十分棘手的任务. 由于学校需要一些材料,校长需要在文章中检索一些信息.校长一共给了小可可N篇文章,每篇文章为一个字符串.现在,校长需 ...

  5. 2017.08.20【NOIP提高组】模拟赛B组 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)

    ####Description 在遥远的S星系中一共有N个星球,编号为1-N.其中的一些星球决定组成联盟,以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧 ...

  6. 2017.08.20【NOIP提高组】模拟赛B组 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)...

    ####Description 在遥远的S星系中一共有N个星球,编号为1-N.其中的一些星球决定组成联盟,以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧 ...

  7. 反抗希碧拉系统续(NOIP2014八校联考第3场第1试10.4)

    看了题解才会做的题..感觉有点思想有点妙就来写一发吧... 题意简版 给出一个特殊的正则表达式,有如下递归定义: 元素:="["+字符集+"]",表示匹配字符集 ...

  8. 计算机网络八校联考,八校联考排名出炉!前十名华师一独占八席,在武汉上华师一有多难?...

    原标题:八校联考排名出炉!前十名华师一独占八席,在武汉上华师一有多难? 近日,湖北省内高中有名的阶段性考试"八校联考"成绩出炉,这也是湖北省高三复课后的第一次线下全省统一考试. 小 ...

  9. JZOJ 4238. 【五校联考5day2】纪念碑

    Description 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一个长为n,宽为m的矩形.它由n* m个1*1的 ...

最新文章

  1. jQuery属性操作
  2. UA MATH571A QE练习 R语言 非参数回归 上
  3. Qt中多线程间的互斥
  4. table表格的两个实现方法(怎样消除内部边框的间距)
  5. MAT之PSO:利用PSO实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度
  6. Eclipse自动生成返回值对象与补全与加注释
  7. python 形参_python中参数总结
  8. Docker入门-简介
  9. 对于最小割的进一步理解
  10. element ui 菜单封装_vue模块化(echart+element ui)
  11. java 按两个键_java – 使用调度程序按下多个键
  12. vmpalyer虚拟机的使用教程,小白也能看懂
  13. 怎么清理计算机磁盘空间,怎样清理电脑磁盘空间
  14. CSU_WF-中南大学网络服务队2020招新培训-硬件知识
  15. 双显示屏切单显时打不开关掉的显示屏上打开的软件的问题
  16. 联想小新22H2版跳过联网方法最新方法
  17. CorelDRAW x4提示非法软件产品被禁用解决方法教程
  18. 电影之记忆4:蝴蝶效应1
  19. 编程与数学的关系_学编程需要很好的数学吗
  20. python后端工程师_Python 招聘:[字节跳动] 后端开发工程师 | Python 技术论坛

热门文章

  1. 单核工作法9:消减待办任务
  2. 深度学习笔记:windows+tensorflow 指定GPU占用内存(解决gpu爆炸问题)
  3. CUDA Stream流并发性
  4. libsvm中svmtrain的参数和返回值
  5. 【笔记】基于Faster R-CNN的除草机器人杂草识别算法
  6. [云炬创业管理笔记]第三章打造优秀创业团队讨论4
  7. [云炬学英语]每日一句2020.9.3
  8. <马哲>不变资本与可变资本及其划分意义2017-12-26
  9. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(一)
  10. 台湾大学林轩田机器学习技法课程学习笔记16(完结) -- Finale