[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. pyqt 多窗口跳转

    今天在做pyqt5的多页面跳转时遇到问题,一点击button按钮,程序会崩溃.在网上查了下,应该是当窗口A调用窗口B的时候,两个窗口不能是同一类型.我写的时候把A.B同时写成了QWidget.把窗口B ...

  2. hadoop生态搭建(3节点)-07.hive配置

    # http://archive.apache.org/dist/hive/hive-2.1.1/ # ================================================ ...

  3. 07 json与os模块(进阶)

    json和os模块 阶段一 .数据交换 1.json的基本介绍 JSON全名是JavaScript Object Notation(即:JavaScript对象标记)它是JavaScript的子集. ...

  4. jenkins邮件发送jmeter接口测试报告

    在Jenkins中配置实现邮件通知,Jenkins提供了两种方式的配置. 一种是Jenkins内置默认的邮件通知,但是它本身有很多局限性,比如它的邮件通知无法提供详细的邮件内容.无法定义发送邮件的格式 ...

  5. 二维数组快速排序(sort+qsort)

    二维数组快速排序 qsort是c中快速排序,如果简单的一维数组排序,想必大家的懂.现在看一下二维数组的排序,虽然可以冒泡但是太费时间了,我们这里使用qsort来快速排序,看代码应该看得懂吧. 代码: ...

  6. 48-Identity MVC:Model前后端验证

    1-创建RegisterViewModel类 namespace MvcCookieAuthSample.ViewModel { public class RegisterViewModel { [R ...

  7. python基础之进程间通信、进程池、协程

    进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 进程队列queue 不同于线程queue,进程 ...

  8. Mysql 启动运行

    MYSQL默认端口:3306用户: root   也可自己添加用户启动数据库服务名: MYSQL (在安装的时候会设置) 在开始菜单栏->附件->右键命令提示符->以管理员身份运行: ...

  9. 环境变量 - Maven

    Linux 1. 备份并编辑配置文件 # cp /etc/profile /etc/profile.bak # vi /etc/profile 2. 设置Maven环境变量 export MAVEN_ ...

  10. js滚动及可视区域的相关的操作

    element.getBoundingClientRect 判断指定元素相对于页面可视窗口的位置信息,通常结合windows.onScroll方法使用,当element.getBoundingClie ...