题意: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的更多相关文章

  1. BZOJ2085 : [Poi2010]Hamsters

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

  2. 【bzoj2085】[Poi2010]Hamsters Hash+倍增Floyd

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

  3. BZOJ 2085 [POI2010] Hamsters

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

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

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

  5. bzoj2085 [Poi2010]Hamsters 矩阵快速幂+字符串hash

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2085 题解 考虑暴力 DP 的做法.令 \(dp[i][j]\) 表示以 \(j\) 为开头的 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. 倍增&矩阵乘法 专题复习

    倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...

  8. 安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告

    [POI2010]CHO-Hamsters 题意: 给出n个互不包含的字符串,要求你求出一个最短的字符串S,使得这n个字符串在S中总共至少出现m次,问S最短是多少? 范围: \(1 \le n \le ...

  9. BZOJ 2080: [Poi2010]Railway 双栈排序

    2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Statu ...

随机推荐

  1. R语言画全基因组关联分析中的曼哈顿图(manhattan plot)

    1.在linux中安装好R 2.准备好画曼哈顿图的R脚本即manhattan.r,manhattan.r内容如下: #!/usr/bin/Rscript #example : Rscript plot ...

  2. 安装好grunt,cmd 提示"grunt不是内部或外部命令" 怎么办?

    Grunt和所有grunt插件都是基于nodejs来运行的,因此,必须安装node.js. (一) 去官网http://nodejs.org/ 下载安装包 node-v6.9.2.msi,直接点击安装 ...

  3. flash中网页跳转总结

    浏览器中,程序同时跳转两个网页地址,第一个地址不会跳转,只会跳转第二个地址,如果第二个地址做延时,则第一个正常跳转,第二个地址会被拦截: 浏览器中,接口返回事件的函数中不能程序跳转网页地址. 这两条结 ...

  4. VSS 的修复和扫描

    关闭所有连接到VSS的客户端如:VSS客户端及VS开发工具,在命令行模式下,运行这个方法: "C:\Program Files (x86)\Microsoft Visual SourceSa ...

  5. Linux多线程服务端编程一些总结

    能接触这本书是因为上一个项目是用c++开发基于Linux的消息服务器,公司没有使用第三方的网络库,卷起袖子就开撸了.个人因为从业经验较短,主 要负责的是业务方面的编码.本着兴趣自己找了这本书.拿到书就 ...

  6. sql 中 in与exists的对比

    1.exists只能用于子查询,可以替代IN,如果查询到结果则退出内部查询,并将条件标记为TRUE,传回全部结果资料 in 不管匹配到匹配不到,都全部匹配 2.根据上面的解释可以得出结论:如果子查询结 ...

  7. ASCII、Unicode、GBK和UTF-8字符编码的区别联系

    转自http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称 ...

  8. RTMP协议中文翻译(首发)(转)

    Adobe公司的实时消息传输协议 摘要 此备忘录描述了 Adobe公司的实时消息传输协议(RTMP),此协议从属于应用层,被设计用来在适合的传输协议(如TCP)上复用和打包多媒体传输流(如音频.视频和 ...

  9. JiaThis分享插件的使用

    jia This的下载地址:http://www.jiathis.com/ 只需要在页面上加上以下代码即可 <span class="jiathis_style"> & ...

  10. linux系统编程之错误处理

    在linux系统编程中,当系统调用出现错误时,有一个整型变量会被设置,这个整型变量就是errno,这个变量的定义在/usr/include/errno.h文件中 #ifndef _ERRNO_H /* ...