设g[i][j]为i串至少加上几个字符后才能包含j,可以通过Hash求出。

然后就是求经过m-1条边的最短路,用倍增加速Floyed即可,时间复杂度$O(n^3\log m)$。

#include<cstdio>
#include<cstring>
#define rep(i,n) for(int i=0;i<n;i++)
typedef long long ll;
typedef unsigned int U;
const int N=200,M=100010,P=31;
const ll inf=1LL<<60;
int n,m,i,j,st[N],en[N],len[N],t=1,flag;U pow[M],f[M];char s[M],a[M];ll ans=inf;
inline U hash(int l,int r){return f[r]-f[l-1]*pow[r-l+1];}
inline int cal(int x,int y){for(int i=(len[x]<len[y]?len[x]:len[y])-1;i;i--)if(hash(en[x]-i+1,en[x])==hash(st[y],st[y]+i-1))return i;return 0;
}
inline void up(ll&a,ll b){if(a>b)a=b;}
struct mat{ll a[N][N];mat(){}inline mat operator*(mat b){mat c;rep(i,n)rep(j,n)c.a[i][j]=inf;rep(k,n)rep(i,n)rep(j,n)up(c.a[i][j],a[i][k]+b.a[k][j]);return c;}
}G,B;
int main(){scanf("%d%d",&n,&m);rep(i,n){scanf("%s",s);st[i]=t,len[i]=std::strlen(s);rep(j,len[i])a[t+j]=s[j];en[i]=t+len[i]-1,t+=len[i];}for(pow[0]=i=1;i<t;i++)pow[i]=pow[i-1]*P;for(i=1;i<t;i++)f[i]=f[i-1]*P+a[i];rep(i,n)rep(j,n)G.a[i][j]=len[j]-cal(i,j),B.a[i][j]=0;for(m--;m;m>>=1,G=G*G)if(m&1){if(!flag)B=G,flag=1;else B=B*G;}rep(i,n)rep(j,n)up(ans,B.a[i][j]+len[i]);return printf("%lld",ans),0;
}

  

转载于:https://www.cnblogs.com/clrs97/p/4742879.html

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 哈希+倍增

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

  3. BZOJ2085: [Poi2010]Hamsters

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

  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 [POI2010] Hamsters

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

  7. POI2010 Hamsters

    Solution 首先可以Hash搞出每个名字连在另一个名字后面所需要增加的字母数量. 而有些人会担心搞完这个后就超时了,但是如果这个都会超时,这道题目还有什么写的必要?所以大胆去干就好了. 那么下面 ...

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

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

  9. [Poi2010]Hamsters[字符串hash+floyed+矩阵快速幂]

    tip: 这里题意有两个细节就是:1.出现名字次数[不指定是哪些名字]2.名字是不相互包含的 解题思路:我们先看看样例:szymonikaszymonikatomck;[长度23] 其中:szymon ...

最新文章

  1. 【青少年编程(第33周)】Scratch(三级)公益活动开营了!
  2. 2020 五大技术趋势:无人驾驶发展、机器视觉崛起、区块链实用化、人类增强技术、超自动化...
  3. JCIFS实现单点登录
  4. [react] 请描述下你对react的新特性Hooks的理解?它有哪些应用场景?
  5. java 反射执行语句_JAVA反射机制
  6. idea数据库反向生成实体类_IntelliJ IDEA 的数据库管理工具实在太方便了
  7. 使用.NET Core进行Linux编程3:简介和第2章
  8. Android应用程序内部启动Activity过程(startActivity)的源代码分析
  9. spring注释_Spring注释
  10. super()的作用
  11. java二分查找分治法
  12. C# 基础(十八)C# 工程自动生成app.manifest、AssemblyInfo.cs、Resources.Designer.cs、Settings.Designer.cs文件的作用
  13. word使用技巧大全
  14. 对于Verilog语言的一些总结
  15. 倒数闩锁CountDownLatch源码浅析
  16. AD中PCB走线实现开窗
  17. awd的批量脚本 pwn_CTF线下赛AWD套路小结
  18. easyCMDB安装 ops版本和挂在U盘
  19. 十二届蓝桥杯第四期模拟比赛
  20. 腾讯社招iOS面试记录

热门文章

  1. 计算机操作系统第四版题库,汤子瀛计算机操作系统第4版配套题库(含名校考研真题)...
  2. C语言学习笔记之C语言简史(不看后悔系列)
  3. javascript设置label标签 for属性
  4. Histograms - 2: Histogram Equalization
  5. 树莓派4B搭建轻量级Web服务器 (Nginx,sqlite,php)
  6. R语言epiDisplay包mlogit.display函数获取无序多分类logistic回归模型的汇总统计信息(各分组模型对应系数及标准差、相对危险降低率RRR值及其置信区间、AIC值等)、汇总统计
  7. 计算机图形学碰撞检测,碰撞检测——GJK算法
  8. 【软考 系统架构设计师】案例分析② 需求分析
  9. PTA 补充题库 7-18 冒泡法排序
  10. 计算机出网关的过程,默认网关是怎么得出来的