BZOJ 2085 [POI2010] Hamsters
题面
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相关推荐
- BZOJ 2085 [Poi2010]Hamsters Hash+倍增floyd
题意:链接 方法: Hash+倍增floyd 解析: 首先这个BZ的无脑翻译我真是受不了. 加俩条件 所有串的长度总和不超过100000,并且对于任意不同子串A,B,A不包含于B,B不包含于A. 然后 ...
- [Hash 倍增Floyd] BZOJ 2085 [Poi2010]Hamsters
Po姐的题解:http://blog.csdn.net/popoqqq/article/details/44077515 搬运下复杂度分析吧 这不会T? 首先设第i个字符串的长度为ai,设k=Σai ...
- BZOJ 2085 Poi2010 Hamsters Hash+倍增Floyd
题目大意:给定n个长度总和不超过10W的字符串,求一个最短的母串,使所有字符串的出现次数之和=m 这n个字符串保证不互相包含 TM能不能好好翻译了 令f[i][j]表示第i个字符串后面接上第j个字符串 ...
- [BZOJ 2085]POI2010 Hamsters
表示蒟蒻在ac这道题之前理解的矩乘都是极为片面的 原本我以为矩乘只能优化线性转移,例如f[n]=ai*f[i]+aj*f[j]+ak*f[k]....... 其实这样的方程也是可以转移的:f[n]=m ...
- BZOJ 2085 luogu P3502 [POI2010]Hamsters (KMP、Floyd、倍增)
数组开小毁一生-- 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2085 这题在洛谷上有个条件是"互不包含",其实 ...
- bzoj 2081 [Poi2010]Beads
2081: [Poi2010]Beads Time Limit: 10 Sec Memory Limit: 259 MB Submit: 687 Solved: 246 [Submit][Status ...
- BZOJ2085 POI2010 Hamsters
POI2010 题解整理 Description 给定 N(N<=200) N(N个总长度小于 105 10^5的字符串,要求给出一条字符串,其中至少出现 m(m<=109) m(m次上述 ...
- BZOJ 2084 [Poi2010]Antisymmetry(manacher)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2084 [题目大意] 对于一个01字符串,如果将这个字符串0和1取反后, 再将整个串反过 ...
- BZOJ 2095 [POI2010]Bridges (最大流、欧拉回路)
洛谷上有这题,但是输出方案缺SPJ..(而且我也懒得输出方案了) 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2095 题解: 首先判 ...
最新文章
- Oracle查询优化-04插入、更新与删除数据
- 当店铺关联,你知道怎么办吗
- Individual Project
- android studio 解决gradle加载依赖慢的问题
- IT桔子分布式项目1
- Elasticsearch集群监控工具bigdesk插件安装
- 配置eclipse,创建类/方法时自动生成作者、创建日期、方法功能等注释
- 关于线段树or 树状树状 在二维平面搞事情!Orz
- nginx防盗链功能
- 设计模式 - 代理模式、委托模式
- SIFT@David G. Lowe
- The Rust Programming Language - 第7章 使用包、crate和模块管理不断增长的项目 - 7.1 包和crate
- dbeaver sql字体异常
- ArtWork+并查集二维
- java通过qq邮箱发送_java实现发送QQ邮箱
- python读取excel文本单元格换行符_Excel自文本导入内容时如何做到单元格内换行...
- 数分钟完成报销 SAP Concur帮助开德阜实现高效费用管理
- PLSQL 64位的安装
- 微信小程序自定义输入框个数
- java并发编程实战wwj----------------------第二阶段-------Guarded Suspension-------24-25