题目大意:给定n个长度总和不超过10W的字符串,求一个最短的母串,使所有字符串的出现次数之和=m 这n个字符串保证不互相包含

TM能不能好好翻译了

令f[i][j]表示第i个字符串后面接上第j个字符串后会增加多少长度

由于j一定不是i的子串,因此这实际上就是在求i的最长的后缀,该后缀同时也是j的前缀

注意不能连出长度为0的边,因此当i=j时要保证这个长度<len[i]

怎么求呢?其实Hash一下,枚举i和j,暴力做就可以了

这不会T?

首先设第i个字符串的长度为ai,设k=Σai

易知当计算f[i][j]时的复杂度是O(min(ai,aj))

那么现在的问题就是当k固定时,最大化ΣΣmin(ai,aj)

我们将所有的ai排个序,容易发现当相邻的两个数ai和aj都变为(ai+aj)/2时目标函数一定会增大

证明:

若ak<=ai<aj,那么min(ak,ai)和min(ak,aj)都不变
若ai<aj<=ak,那么min(ai,ak)+min(aj,ak)=ai+aj一定不变

min(ai,ai)+min(aj,aj)=ai+aj也不变

只有min(ai,aj)增大了

因此最终当所有的ai都相同时目标函数最大

故每个ai都等于k/n,这一步的最终时间复杂度是O(k/n*n^2)=O(kn)

k=10W,n=200,显然不会T

现在的问题就是给定一张图求源点出发走m条边的最短路

倍增Floyd即可

最终时间复杂度O(kn+n^3logn)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 220
#define BASE 131
#define MOD 999911657
using namespace std;
int n,m,len[M];
char str[101000],*s[M];
long long power[101000],_hash[101000],*hash[M];
long long f[M][M],g[M][M],ans[M][M];
int Get_Hash(long long *hash,int l,int r)
{int len=r-l+1;return (hash[r]-hash[l-1]*power[len]%MOD+MOD)%MOD;
}
int Calculate(int x,int y)//计算x最长的后缀,这个后缀也是y的前缀
{int i;for(i=min(len[x],len[y])-(len[y]<=len[x]);~i;i--)if( Get_Hash(hash[x],len[x]-i,len[x]-1) == Get_Hash(hash[y],0,i-1) )return i;return 0;
}
int main()
{int T,i,j,k;cin>>n>>m;int temp=1,max_len=0;for(i=1;i<=n;i++){scanf("%s",str+temp);s[i]=str+temp;hash[i]=_hash+temp;len[i]=strlen(s[i]);max_len=max(max_len,len[i]);++temp+=len[i];for(j=0;j<len[i];j++)hash[i][j]=(hash[i][j-1]*BASE+s[i][j])%MOD;}for(power[0]=1,i=1;i<=max_len;i++)power[i]=power[i-1]*BASE%MOD;memset(f,0x3f,sizeof f);for(i=1;i<=n;i++){f[0][i]=len[i];for(j=1;j<=n;j++)f[i][j]=len[j]-Calculate(i,j);}memset(ans,0x3f,sizeof ans);for(i=1;i<=n;i++)ans[i][i]=0;for(T=0;(1<<T)<=m;T++){if(T){memset(g,0x3f,sizeof g);for(k=0;k<=n;k++)for(i=0;i<=n;i++)for(j=0;j<=n;j++)g[i][j]=min(g[i][j],f[i][k]+f[k][j]);memcpy(f,g,sizeof f);}if(m&(1<<T) ){memset(g,0x3f,sizeof g);for(k=0;k<=n;k++)for(i=0;i<=n;i++)for(j=0;j<=n;j++)g[i][j]=min(g[i][j],f[i][k]+ans[k][j]);memcpy(ans,g,sizeof ans);}}long long ans=0x3f3f3f3f3f3f3f3fll;for(i=1;i<=n;i++)ans=min(ans,::ans[0][i]);cout<<ans<<endl;return 0;
}

BZOJ 2085 Poi2010 Hamsters Hash+倍增Floyd相关推荐

  1. BZOJ 2085 [Poi2010]Hamsters Hash+倍增floyd

    题意:链接 方法: Hash+倍增floyd 解析: 首先这个BZ的无脑翻译我真是受不了. 加俩条件 所有串的长度总和不超过100000,并且对于任意不同子串A,B,A不包含于B,B不包含于A. 然后 ...

  2. 【bzoj2085】[Poi2010]Hamsters hash+倍增

    dis[i][j][k]表示从第i个串的结尾到第j个串的结尾走过2^k个串的最小长度 dis[i][j][0]=len[j]-cal(i,j) cal(i,j)表示如果i的最长后缀等于j的最长前缀 倍 ...

  3. [Hash 倍增Floyd] BZOJ 2085 [Poi2010]Hamsters

    Po姐的题解:http://blog.csdn.net/popoqqq/article/details/44077515 搬运下复杂度分析吧 这不会T? 首先设第i个字符串的长度为ai,设k=Σai ...

  4. BZOJ 2085 [POI2010] Hamsters

    题面 Description Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多 ...

  5. [BZOJ 2085]POI2010 Hamsters

    表示蒟蒻在ac这道题之前理解的矩乘都是极为片面的 原本我以为矩乘只能优化线性转移,例如f[n]=ai*f[i]+aj*f[j]+ak*f[k]....... 其实这样的方程也是可以转移的:f[n]=m ...

  6. BZOJ 2085 luogu P3502 [POI2010]Hamsters (KMP、Floyd、倍增)

    数组开小毁一生-- 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2085 这题在洛谷上有个条件是"互不包含",其实 ...

  7. BZOJ 2084: [Poi2010]Antisymmetry(Hash+二分)

    求一个01序列的子串取反并反转后与原串相同的个数. 很显而易见的是,反转的话只要子串对应的i和n-i+1位相反即可,这个看一下样例能很快看出来. 所以我们正着求一遍hash,反着取反然后求hash. ...

  8. bzoj 1706: [usaco2007 Nov]relays 奶牛接力跑(倍增floyd)

    1706: [usaco2007 Nov]relays 奶牛接力跑 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 675  Solved: 352 [S ...

  9. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)

    题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...

最新文章

  1. 30个流行的jQuery Plugins
  2. python打包工具哪个好用_python打包工具比较
  3. java接口废弃注释_Java注释Override、Deprecated、SuppressWarnings详解
  4. C++/C--多个vector拼接的方法【转载】
  5. c和java哪个好学_编程入门学习c++和Java哪个比较好
  6. PHP三维数组变一维
  7. Android自定义Toast
  8. Java中Jsp和Servlet上传和下载文件
  9. maven中scope属性
  10. c语言50个小程序,C语言50小程序.doc
  11. pycharm中plt.show()不显示图像的解决办法
  12. Julia : win下cmd和repl中执行.jl程序
  13. 【strlen函数的使用及strlen函数的三种模拟实现】· C语言详解库函数篇(一)
  14. vite:配置ip访问
  15. java面试的笔试题
  16. Markdown排版微信公众号文章
  17. 群晖NAS搭建web服务器并公网可访问 2-4
  18. 服务监控可以监控哪些
  19. 无形装逼,最为致命——玩LOL那些有趣的台词
  20. android 中篇 文章推荐

热门文章

  1. voltdb join 报错
  2. node_modules\typescript\lib 未指向有效的 tsserver 安装 将禁用TypeScript 语言功能
  3. ganglia离线安装_Ganglia 监控实战!
  4. android代码密码隐藏,android 显示密码和隐藏密码
  5. 分段式多级离心泵_分段式多级离心泵装配质量要求
  6. 全国计算机报名系统入口2020年,2020年3月全国计算机二级报名系统入口
  7. IllegalArgumentException(非法参数异常)和其子类异常NumberFormatException,以及异常类之间的继承关系和产生原因
  8. 冒泡法和选择法 排序算法实现
  9. STM32F103操作DS1302时钟芯片串口显示(标准库和HAL库)
  10. Rabbitmq之Federation配置