题面

Description

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

Input

输入:第一行n(1<=n<=200)和m(1<=m<=10的9此方),n表示有多少个仓鼠,m表示Tz希望出现名字的次数,接下来n行,每行都是仓鼠的名字(中间没有空格)。

Output

输出:一行,最短的字母序列的长度。

Sample Input

4 5
monika
tomek
szymon
bernard
Sample Output
23

Sample Output

23

题目大意

略.

题解

这一题的题面漏了一个条件: 字符串之间两两不相包含. 由于\(n \le 200\), 不难想到让这些名字两两作一次KMP, 得到一个转移矩阵. 我们考虑如何让\(m\)个名字在所求的串中出现. 建立一个初始矩阵: 对角线为每个字符串的长度, 其余位置均为\(+\infty\). 对初始矩阵与转移矩阵作\(m - 1\)次转移(使用倍增的方法, 类似于快速幂, 但不是矩阵乘法, 而是对应的行向量和列向量加起来取\(\min\)值). 得到的矩阵中, \(res_{i j}\)表示开始第一个名字为\(i\), 最后出现的名字为\(j\)的需要的最少字符数量.
在\(res_{n \times n}\)中取min即可.
一些细节需要注意, 已经在代码中标注.

#include <cstdio>
#include <cstring>
#include <algorithm>const int N = 200, LEN = (int)1e5;
const long long INF = (long long)1e15;namespace KMP
{inline void initialize(char *str, int len, int *pre){pre[0] = -1;for(int i = 1; i < len; ++ i){int p = pre[i - 1];for(; ~ p && str[p + 1] ^ str[i]; p = pre[p]);if(str[p + 1] == str[i])++ p;pre[i] = p;}}inline int match(char *s, int len, char *t, int *pre){int p = -1;for(int i = 0; i < len; ++ i){for(; ~ p && t[p + 1] ^ s[i]; p = pre[p]); // 假如s和t是同一个串的话, 则要特判if(t[p + 1] == s[i] && (s != t || p + 1 < i))++ p;}return p + 1;}
}struct matrix
{long long a[N][N];int n;inline matrix(int _n){n = _n;}inline matrix friend operator *(const matrix &A, const matrix &B){static matrix res(A.n);for(int i = 0; i < A.n; ++ i)for(int j = 0; j < A.n; ++ j){res.a[i][j] = INF;for(int k = 0; k < A.n; ++ k)res.a[i][j] = std::min(A.a[i][k] + B.a[k][j], res.a[i][j]);}return res;}
};inline void power(matrix A, int x, matrix &res)
{for(; x; x >>= 1, A = A * A)if(x & 1)res = res * A;
}int main()
{#ifndef ONLINE_JUDGEfreopen("BZOJ2085.in", "r", stdin);// freopen("BZOJ2085.out", "w", stdout);#endifint n, m;scanf("%d%d", &n, &m);static char str[N][LEN];static int pre[N][LEN];for(int i = 0; i < n; ++ i)scanf("%s", str[i]), KMP::initialize(str[i], strlen(str[i]), pre[i]);static matrix A(n);for(int i = 0; i < n; ++ i)for(int j = 0; j < n; ++ j)A.a[i][j] = strlen(str[j]) - KMP::match(str[i], strlen(str[i]), str[j], pre[j]);static matrix res(n);for(int i = 0; i < n; ++ i)for(int j = 0; j < n; ++ j)res.a[i][j] = i ^ j ? INF : strlen(str[i]);power(A, m - 1, res); // m要减1long long ans = INF;for(int i = 0; i < n; ++ i)for(int j = 0; j < n; ++ j)ans = std::min(ans, res.a[i][j]);printf("%lld", ans);
}

转载于:https://www.cnblogs.com/ZeonfaiHo/p/7110300.html

BZOJ 2085 [POI2010] Hamsters相关推荐

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

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

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

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

  3. BZOJ 2085 Poi2010 Hamsters Hash+倍增Floyd

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

  4. [BZOJ 2085]POI2010 Hamsters

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

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

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

  6. bzoj 2081 [Poi2010]Beads

    2081: [Poi2010]Beads Time Limit: 10 Sec Memory Limit: 259 MB Submit: 687 Solved: 246 [Submit][Status ...

  7. BZOJ2085 POI2010 Hamsters

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

  8. BZOJ 2084 [Poi2010]Antisymmetry(manacher)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2084 [题目大意] 对于一个01字符串,如果将这个字符串0和1取反后, 再将整个串反过 ...

  9. BZOJ 2095 [POI2010]Bridges (最大流、欧拉回路)

    洛谷上有这题,但是输出方案缺SPJ..(而且我也懒得输出方案了) 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2095 题解: 首先判 ...

最新文章

  1. Oracle查询优化-04插入、更新与删除数据
  2. 当店铺关联,你知道怎么办吗
  3. Individual Project
  4. android studio 解决gradle加载依赖慢的问题
  5. IT桔子分布式项目1
  6. Elasticsearch集群监控工具bigdesk插件安装
  7. 配置eclipse,创建类/方法时自动生成作者、创建日期、方法功能等注释
  8. 关于线段树or 树状树状 在二维平面搞事情!Orz
  9. nginx防盗链功能
  10. 设计模式 - 代理模式、委托模式
  11. SIFT@David G. Lowe
  12. The Rust Programming Language - 第7章 使用包、crate和模块管理不断增长的项目 - 7.1 包和crate
  13. dbeaver sql字体异常
  14. ArtWork+并查集二维
  15. java通过qq邮箱发送_java实现发送QQ邮箱
  16. python读取excel文本单元格换行符_Excel自文本导入内容时如何做到单元格内换行...
  17. 数分钟完成报销 SAP Concur帮助开德阜实现高效费用管理
  18. PLSQL 64位的安装
  19. 微信小程序自定义输入框个数
  20. java并发编程实战wwj----------------------第二阶段-------Guarded Suspension-------24-25

热门文章

  1. 5G 核心网 PDU Session Release 信令流程
  2. servlet Context
  3. 什么蓝牙耳机适合realme手机?适合realme的蓝牙耳机推荐
  4. 心法利器[88] | 有关大模型幻觉问题的思考
  5. 5G已在咫尺,MWC19上海进入两周倒计时
  6. 做一个记事闹铃的软件笔记
  7. CNNIC发布第38次《中国互联网络发展状况统计报告》
  8. 别只会搜日志了,求你懂点检索原理吧
  9. 8. A/D转换器【ADC0809】
  10. GirdView 通过 RenderControl 导出 excel 日期问题