Description


Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算。现在Tz想好了要出现多少个名字,请你求出最短的字母序列的长度是多少。

1<=n<=200
1<=m<=10^9

Solution


一开始完全没看到m的范围于是傻了,被文化课吊打后还要在这里翻船

可以用f[i,j,k]表示以i开始j结束出现了2^k个名字的最短序列,推的时候倍增就行了
初始条件f[i,j,0]可以用哈希+二分,实际上暴力扫是不会T的
为了保证空间f可以滚动

Code


#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define drp(i,st,ed) for (int i=st;i>=ed;--i)
#define fill(x,t) memset(x,t,sizeof(x))
#define copy(x,t) memcpy(x,t,sizeof(x))typedef long long LL;
const LL INF=100000000000000000LL;
const int MOD1=1000000007;
const int MOD2=1000000009;
const int N=205;
const int L=100005;LL pow1[L],pow2[L],tmp[N];
LL f[N][N],g[N][N],ans[N];int len[N],hash1[N][L],hash2[N][L];char str[L];LL get_dis(int x,int y) {int lim=std:: min(len[x],len[y])-(x==y);drp(i,lim,1) {LL u1=(hash1[x][len[x]]-(LL)hash1[x][len[x]-i]*pow1[i]%MOD1+MOD1)%MOD1;LL u2=hash1[y][i];if (u1!=u2) continue;LL v1=(hash2[x][len[x]]-(LL)hash2[x][len[x]-i]*pow2[i]%MOD2+MOD2)%MOD2;LL v2=hash2[y][i];if (v1==v2) return len[y]-i;}return len[y];
}int main(void) {int n,m,max=0; scanf("%d%d",&n,&m); m-=1;rep(i,1,n) {scanf("%s",str+1);len[i]=strlen(str+1);max=std:: max(len[i],max);rep(j,1,len[i]) {hash1[i][j]=(hash1[i][j-1]*27LL%MOD1+str[j]-'a'+1)%MOD1;hash2[i][j]=(hash2[i][j-1]*27LL%MOD2+str[j]-'a'+1)%MOD2;}}pow1[0]=1; rep(i,1,max) pow1[i]=pow1[i-1]*27LL%MOD1;pow2[0]=1; rep(i,1,max) pow2[i]=pow2[i-1]*27LL%MOD2;rep(i,1,n) ans[i]=len[i];rep(i,1,n) rep(j,1,n) {f[i][j]=get_dis(i,j);}int T=log2(m)+0.1;rep(pp,0,T) {LL now=1<<pp;if (now&m) {rep(i,1,n) tmp[i]=INF;rep(i,1,n) {rep(j,1,n) if (f[i][j]+ans[i]<tmp[j]) {tmp[j]=f[i][j]+ans[i];}}rep(i,1,n) ans[i]=tmp[i];}rep(i,1,n) rep(j,1,n) {g[i][j]=INF;rep(k,1,n) {if (f[i][k]+f[k][j]<g[i][j]) {g[i][j]=f[i][k]+f[k][j];}}}rep(i,1,n) rep(j,1,n) f[i][j]=g[i][j];}LL prt=INF;rep(i,1,n) prt=std:: min(prt,ans[i]);printf("%lld\n", prt);return 0;
}

bzoj2085 [Poi2010]Hamsters 哈希+倍增相关推荐

  1. BZOJ2085 POI2010 Hamsters

    POI2010 题解整理 Description 给定 N(N<=200) N(N个总长度小于 105 10^5的字符串,要求给出一条字符串,其中至少出现 m(m<=109) m(m次上述 ...

  2. BZOJ2085: [Poi2010]Hamsters

    题目大意:给出n个互不包含的字符串,要求你求出一个最短的字符串S,使得这n个字符串在S中总共至少出现m次,问S最短是多少 我们构造这样一个矩阵A: A[i][j]表示第j个字符串长度-第i个字符串的最 ...

  3. BZOJ2085 : [Poi2010]Hamsters

    设g[i][j]为i串至少加上几个字符后才能包含j,可以通过Hash求出. 然后就是求经过m-1条边的最短路,用倍增加速Floyed即可,时间复杂度$O(n^3\log m)$. #include&l ...

  4. bzoj2085: [Poi2010]Hamsters(hash+矩阵快速幂)

    传送门 题意:给定n个长度总和不超过1e5的字符串,求一个最短的母串,使所有字符串的出现次数之和=m 这n个字符串保证不互相包含,n≤200 思路: 由于保证字符串两两不相互包含. 因此我们可以考虑 ...

  5. 【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的最长前缀 倍 ...

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

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

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

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

  8. BZOJ 2085 Poi2010 Hamsters Hash+倍增Floyd

    题目大意:给定n个长度总和不超过10W的字符串,求一个最短的母串,使所有字符串的出现次数之和=m 这n个字符串保证不互相包含 TM能不能好好翻译了 令f[i][j]表示第i个字符串后面接上第j个字符串 ...

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

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

最新文章

  1. 关于css选择器的问题 + * ~这三个有什么区别
  2. Spring @CrossOrigin 通配符 解决跨域问题
  3. day01: oracle12C在Linux7.5上图形化安装部署方法:
  4. ITK:使用Viola Wells互信息执行多模式注册
  5. 顺丰负债300亿就压力山大,而万达曾经负债4000亿却稳如泰山
  6. [转]asp.net导出数据到Excel的三种方法
  7. c语言的表达式2 4 6 8的值,C语言程序设计测试题二
  8. 一家踏实做产品,在疫情下销售增速仍达35%的公司,年报长啥样?
  9. UI标签库专题五:JEECG智能开发平台 Tabs(选项卡父标签)
  10. HomeBrew 更换为国内源--提高brew命令操作速度
  11. LeetCode 1663. 具有给定数值的最小字符串
  12. oracle archivelog满了,Oracle archivelog占用100%如何处理?
  13. Mysql Federated For Windows
  14. python窗口大小动态变化_python – 如何让tkinter画布动态调整窗口宽度?
  15. Javascript:使用setAttribute设置某个标签节点display为none仍然显示
  16. python网页教程_python 查询 网页Python基础教程01 Hello World!
  17. SOUI中几个view视图控件的基本使用
  18. 在语雀中输入汉语拼音
  19. 物联网大赛 - Android学习笔记(三)Android 事件处理
  20. 火星来客创业周刊第1期:独立开发者Twitter小工具60天,从月入300美金到月入3000美金

热门文章

  1. 简单4步教你破解WIFI密码
  2. ChatGPT情商很高,但并不适合当搜索引擎
  3. C# ping命令,ping网络状态
  4. 2008 R2 服务器 频繁自动重启 有能解决的方案吗
  5. 《操作系统——真象还原》书评
  6. Windows操作系统用注册表删除启动项
  7. mate8鸿蒙,比安卓速度快60%?华为鸿蒙OS或8月9日亮相
  8. 位(bit)、字节(Byte)、KB、MB、GB、TB之间的换算关系
  9. Linux基础命令(小白教程,宝妈式教程,有手就会)第一期
  10. Java 网络编程学习复习总结(一)-2021.05.28