[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 ...
随机推荐
- Textrank算法介绍
先说一下自动文摘的方法.自动文摘(Automatic Summarization)的方法主要有两种:Extraction和Abstraction.其中Extraction是抽取式自动文摘方法,通过提取 ...
- linux学习之——vim简明教程
摘自 http://blog.csdn.net/niushuai666/article/details/7275406 ——————————正文开始—————————— 你想以最快的速度学习人类史上 ...
- 互联网商业模式O2O、C2C、B2B、B2C等介绍
O2O是online to offline分为四种运营模式: 1.online to offline是线上交易到线下消费体验 2.offline to online是线下营销到线上交易 3.offli ...
- CSS换行文本溢出显示省略号,多行
首先,div部分 <body> <div>多行的显示该如何解决呢,后面经过一番google后,我找到了chrome的一个API可以解决上面提到的需求-webkit-line-c ...
- 有向图强连通分量的Tarjan算法
有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...
- 内核对TCP REUSEPORT的优化
Q&A 当有人问起我关于reuseport的一些事的时候,我们的对话基本如下:Q1:什么是reuseport?A1:reuseport是一种套接字复用机制,它允许你将多个套接字bind在同一个 ...
- U盘启动盘 安装双系统 详细教程
U盘启动盘 安装win7+linux双系统 最近在看鸟哥的linux 私房菜 ,看到多重系统那部分,自然的安装多重系统的激情由此而燃.在网上看了很多资料,感觉都不全.经过艰辛的摸索,终于被我发现了一个 ...
- 匿名访问ReportService报表服务器(一)
我的数据库版本是sql server 2008 r2,系统环境是windows server2008. 对于sql server 2008 r2上报rs报表的匿名访问问题,我这边尝试过两个可行方案: ...
- WPF Image控件的Source属性是一个ImageSource对象
1.固定的图片路径是可以的,如下: <Image Source="../test.png" /> 2.绑定的Path是一个String类型的图片路径,而实际情况它需要的 ...
- 使用cookie实现计数器功能
思路是:若第一次访问,创建cookie.若访问次数大于一,则先读出cookie值赋给一个值,然后再重新写入cookie. <?php if(!isset($_COOKIE['num'])){ $ ...