[POI2010]CHO-Hamsters

题意:

给出n个互不包含的字符串,要求你求出一个最短的字符串S,使得这n个字符串在S中总共至少出现m次,问S最短是多少?

范围:

\(1 \le n \le 200,1 \le m \le 10^9\),\(\sum_S \le 100000\)


图论模型,矩阵乘法优化floyd

首先虚点连字符串,边权为长度,然后字符串相互连接,边权为后者长度-最长公共部分

前后匹配的方法比较多,hash,kmp,AC自动机都行

然后很容易找到一个floyd的方法

我们利用矩阵快速幂进行优化就行了


Code:

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define ll long long
ll min(ll x,ll y){return x<y?x:y;}
const int N=202;
int n,m;
struct matrix
{
ll dx[N][N];
matrix()
{
memset(dx,0x3f,sizeof(dx));
}
matrix friend operator *(matrix n1,matrix n2)
{
matrix n3;
for(int k=0;k<=n;k++)
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
n3.dx[i][j]=min(n3.dx[i][j],n1.dx[i][k]+n2.dx[k][j]);
return n3;
}
}x,f;
char name[100010];
const ll base=26,mod=19260817;
ll g[N][N],pow[100010];
vector <ll> has[N];
ll get_hash(int id,int l,int r)
{
return ((has[id][r]-has[id][l-1]*pow[r+1-l])%mod+mod)%mod;
}
ll cal(int i,int j)
{
int l1=x.dx[0][i],l2=x.dx[0][j];
for(int k=min(l1,l2)-1;k;k--)
if(get_hash(i,l1-k+1,l1)==get_hash(j,1,k)) return k;
return 0;
}
void init()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",name+1);
int len=strlen(name+1);
x.dx[0][i]=len;
has[i].push_back(0);
for(int j=1;j<=len;j++)
has[i].push_back(has[i][j-1]*base%mod+name[j]-'a');
}
pow[0]=1;
for(int i=1;i<=100000;i++)
pow[i]=pow[i-1]*base%mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
x.dx[i][j]=x.dx[0][j]-cal(i,j);
}
void work()
{
--m;
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
f.dx[i][j]=x.dx[i][j];
while(m)
{
if(m&1) f=f*x;
x=x*x;
m>>=1;
}
ll ans=0x7fffffffffffffffll;
for(int i=1;i<=n;i++)
ans=min(ans,f.dx[0][i]);
printf("%lld\n",ans);
}
int main()
{
init();
work();
return 0;
}

2018.8.18

安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告的更多相关文章

  1. 安徽师大附中%你赛day9 T3 贵 解题报告

    贵 问题描述 苟先生的狼狗大军没有追上富先生, 所以他把它们都解雇了, 决定去雇佣一些更好的狗, 不过狗可是很贵的.苟先生有 \(w\) 元钱, 有 \(n\) 条狗可以雇佣, 第 \(i\) 条狗有 ...

  2. 安徽师大附中%你赛day5 T3 树上行走 解题报告

    树上行走 题目背景 \(\mathrm{Smart}\) 的脑洞非常大, 经常幻想出一些奇怪的东西. 题目描述 某一天,\(\mathrm{Smart}\) 幻想出了一棵没有边际的二叉树,脑补着在那棵 ...

  3. 安徽师大附中%你赛day3T1 怜香惜玉 解题报告

    怜香惜玉 题意: 已知 \(f(x)=\frac{2 \times \sum_{(i,x)=1}^x i}{φ(x)}\) 先给定数据组数\(t\)和\(k\) 每组数据给出\(n\),求\(\sum ...

  4. 安徽师大附中%你赛day2T3 巧克力 解题报告

    巧克力 题目描述 小\(T\)有\(N\)块巧克力, 每块巧克力上都有一句话(由小写英文字母组成,不含标点) .现在每块巧克力都断成了若干截,更糟糕的是,有一些碎片丢失了 ,但是剩下的碎片之间的顺序是 ...

  5. 安徽师大附中%你赛day9 T2 富 解题报告

    富 题目背景 出于某些原因, 苟先生在追杀富先生. 题目描述 富先生所在的地方是一个\(n\times m\)的网格,苟先生排出了他的狼狗大军,共有\(k\)条狗,第\(i\)条狗所在的位置为\((x ...

  6. 安徽师大附中%你赛day7 T2 乘积 解题报告

    乘积 题目背景 \(\mathrm{Smart}\) 最近在潜心研究数学, 他发现了一类很有趣的数字, 叫做无平方因子数. 也就是这一类数字不能够被任意一个质数的平方整除, 比如\(6\).\(7\) ...

  7. 安徽师大附中%你赛day4T2 演讲解题报告

    演讲 题目背景: 众所周知,\(\mathrm{Zdrcl}\)是一名天天\(\mathrm{AK}\)的高水平选手. 作为一民长者,为了向大家讲述自己\(\mathrm{AK}\)的经验,他决定在一 ...

  8. 安徽师大附中%你赛day4T1 金字塔 解题报告

    金字塔 题目背景: \(Zdrcl\)带着妹子们来到了胡夫金字塔周边旅游, 发现这里正在进行一个有关金字塔的游戏 题目描述: 游戏规则如下: 1. 这里的金字塔是一个 \(N\) 阶的二维金字塔. 2 ...

  9. SCNU 2015ACM新生赛初赛【1006. 3D打印】解题报告

            题目链接详见SCNU 2015新生网络赛 1006. 3D打印 .出题思路来自codevs 3288. 积木大赛,属于模拟题.         首先我们把“选择从第L部分到第R部分”理 ...

随机推荐

  1. Spring笔记1

    Spring Spring特点 1. 方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合.有了Spring,用户 ...

  2. Discuz论坛搜索下拉框插件openSug

    Discuz!只需安装openSug插件即可获得带有“搜索框提示”功能的搜索框,让您的Discuz搜索更便捷! 下载:https://www.opensug.org/faq/.../opensug.d ...

  3. python中的字符串(str)操作

    字符串是python中数据类型.一般就单引号(‘’)或双引号(“”)引起来的内容就是字符串. 例如:下面两个都是定义字符串 str1 = "hello world" str2 = ...

  4. html 弹框 优化 alert

    <!DOCTYPE html> <html> <head> <title>cs</title> </head> <styl ...

  5. phpcms2008网站漏洞如何修复 远程代码写入缓存漏洞利用

    SINE安全公司在对phpcms2008网站代码进行安全检测与审计的时候发现该phpcms存在远程代码写入缓存文件的一个SQL注入漏洞,该phpcms漏洞危害较大,可以导致网站被黑,以及服务器遭受黑客 ...

  6. 02---Nginx

    Nginx .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: ...

  7. 查看sql 作业明细及运行记录

    --查看作业明细及状态 select j.name 'Job名', j.description '描述', j.ENABLED job_enabled, cast(js.last_run_date a ...

  8. delphi 数据库中Connection与Query连接数量问题思考

    今天闲着没事,测试了一下Connection连接MSSQL,可以承受多少连接.    1.看看ADOConnection的连接数:写了一个代码,动态创建,测试了10000个连接,花了大约5~10分钟创 ...

  9. 【TRICK】[0,n)中所有大小为k的子集的方法

    << k) - ; <<n)) { int x = comb & -comb, y = comb + x; comb = (((comb & ~y)/x)> ...

  10. Java 图像处理框架-Marvin

    网上看到,摘录过来的,暂时还没涉足这方面的东西 Marvin 1.4.5 的插件接口支持处理多个图像作为输入,新的插件可通过多个图片来确认背景,新的插件可使用多个图片来合并相同场景. Marvin 是 ...