[poi2010]Hamsters
题意:Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算。现在Tz想好了要出现多少个名字,请你求出最短的字母序列的长度是多少。(n <= 200, m <= 1e9)
思路:首先可以处理出g[a][b]表示b接在a后面的长度(即重复部分之前都不算)
那么就可以转化成求长度m-1的最短路。
假设dis[i][a][b]为经过i步a走到b的最短路,那么dis[i][a][b] = min(dis[i/2][a][c] + dis[i-i/2][c][b]) (1<=c<=n)
那么是不是就可以利用快速幂的思想了。。
前面求g[a][b]可利用hash判断是否一样
code:
/*
* Author: Yzcstc
* Created Time: 2014/11/12 20:54:48
* File Name: hamsters.cpp
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#define M0(x) memset(x, 0, sizeof(x))
#define repf(i, a, b) for (int i = (a); i <= (b); ++i)
#define Inf 0x7fffffff
#define M 10007
using namespace std;
typedef long long ll;
const int maxn = ;
int n, m;
char str[];
vector<int> hs[];
int sz[maxn], pw[];
ll A[maxn][maxn], B[maxn][maxn];
ll s[maxn], tmp[maxn]; inline int Hash(const int &p, const int& l, const int& r){
return hs[p][r] - hs[p][l-] * pw[r-l+];
} void init(){
int len, v;
repf(i, , n){
scanf("%s", str + );
sz[i] = len = strlen(str + );
hs[i].push_back(v = );
repf(j, , len)
v = v * M + str[j], hs[i].push_back(v);
}
} void modify(ll *s, ll A[][maxn]){
memset(tmp, 0x3f, sizeof(tmp));
// cout << tmp[0] << endl;
for (int i = ; i <= n; ++i)
for (int j = ; j <= n; ++j)
tmp[j] = min(tmp[j], s[i] + A[i][j]);
repf(i, , n) s[i] = tmp[i];
} void modify(ll A[][maxn]){
memset(B, 0x3f, sizeof(B));
repf(k, , n) repf(i, , n) repf(j, , n)
B[i][j] = min(B[i][j], A[i][k] + A[k][j]);
repf(i, , n) repf(j, , n) A[i][j] = B[i][j];
} void quick(int n){
for (;n>; n>>=){
if (n & ) modify(s, A);
modify(A);
}
} void solve(){
repf(i, , n) repf(j, , n){
A[i][j] = sz[j];
for (int k = max(, sz[i]-sz[j]+); k <= sz[i]; ++k)
if (Hash(i, k, sz[i]) == Hash(j, , sz[i]-k+)){
A[i][j] = sz[j] - (sz[i]-k+); break;
}
}
repf(i, , n) s[i] = sz[i];
quick(--m);
ll ans = 1LL<<;
// cout << ans << endl;
repf(i, , n) ans = min(ans, s[i]);
cout << ans << endl;
} int main(){
pw[] = ;
repf(i, , ) pw[i] = pw[i-] * M;
while (scanf("%d%d", &n, &m) != EOF){
init();
solve();
}
return ;
}
[poi2010]Hamsters的更多相关文章
- BZOJ2085 : [Poi2010]Hamsters
设g[i][j]为i串至少加上几个字符后才能包含j,可以通过Hash求出. 然后就是求经过m-1条边的最短路,用倍增加速Floyed即可,时间复杂度$O(n^3\log m)$. #include&l ...
- 【bzoj2085】[Poi2010]Hamsters Hash+倍增Floyd
题目描述 Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多少个名字,请你求出最 ...
- BZOJ 2085 [POI2010] Hamsters
题面 Description Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多 ...
- BZOJ 2085 luogu P3502 [POI2010]Hamsters (KMP、Floyd、倍增)
数组开小毁一生-- 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2085 这题在洛谷上有个条件是"互不包含",其实 ...
- bzoj2085 [Poi2010]Hamsters 矩阵快速幂+字符串hash
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2085 题解 考虑暴力 DP 的做法.令 \(dp[i][j]\) 表示以 \(j\) 为开头的 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 倍增&矩阵乘法 专题复习
倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...
- 安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告
[POI2010]CHO-Hamsters 题意: 给出n个互不包含的字符串,要求你求出一个最短的字符串S,使得这n个字符串在S中总共至少出现m次,问S最短是多少? 范围: \(1 \le n \le ...
- BZOJ 2080: [Poi2010]Railway 双栈排序
2080: [Poi2010]Railway Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 140 Solved: 35[Submit][Statu ...
随机推荐
- html只给自己
//另外一个 height:400px; weight:400px; border-top-left-radius: 10px; border-top-right-radius: 10px; bord ...
- 类的static成员并用其实现一个单例模式
对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量.如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时我们可以用类的静态成员来 ...
- javascript一些方法兼容
javascript一些方法兼容 标签(空格分隔): javascript 方法收集 [TOC] Object.keys 参考地址 if (!Object.keys) Object.keys = fu ...
- python课程第四周重点记录
1.迭代器 names = iter(["alex","jack","rain"]) #声明列表的一个迭代器 names.__next__( ...
- CSS3制作各种形状图像
圆形-椭圆形-三角形-倒三角形=左三角形-右三角形-菱形-平行四边形- 星形-六角星形-五边形-六边形-八角形-心形-蛋形-无穷符号-消息提示框 不废话直接 html界面(亲测的) ------转自百 ...
- c# Exception 异常信息归整
private string ErrorMessage(Exception exception) { StringBuilder stringBuilder = new StringBuilder() ...
- Linq To Nhibernate 性能优化(入门级)
最近都是在用Nhibernate和数据库打交道,说实话的,我觉得Nhibernate比Ado.Net更好用,但是在对于一些复杂的查询Nhibernate还是比不上Ado.Net.废话不多说了,下面讲讲 ...
- Java Web2
JavaBean组件. 定义方法:(假设有一个JavaBean的类名为CounterBean,它有一个count属性.) //在JSP文件中分别定义4种范围内的JavaBean对象的语法 //in p ...
- Maemo平台上如何使用Openvpn
Maemo是一个开源的智能手机软件平台社区,它是基于Debia的LInux发行版本,Maemo的大多是开源的,并已经制定了Maemo和诺基亚内部的设备与许多开源项目,例如,Debian的Linux内核 ...
- 用Asp.net写自己的服务框架
阅读目录 开始 理解Asp.net管线 HttpHandler HttpModule 关于Content-Encoding的解释 选 HttpHandler 还是 HttpModule ? 看不见的性 ...