安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告
[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 解题报告的更多相关文章
- 安徽师大附中%你赛day9 T3 贵 解题报告
贵 问题描述 苟先生的狼狗大军没有追上富先生, 所以他把它们都解雇了, 决定去雇佣一些更好的狗, 不过狗可是很贵的.苟先生有 \(w\) 元钱, 有 \(n\) 条狗可以雇佣, 第 \(i\) 条狗有 ...
- 安徽师大附中%你赛day5 T3 树上行走 解题报告
树上行走 题目背景 \(\mathrm{Smart}\) 的脑洞非常大, 经常幻想出一些奇怪的东西. 题目描述 某一天,\(\mathrm{Smart}\) 幻想出了一棵没有边际的二叉树,脑补着在那棵 ...
- 安徽师大附中%你赛day3T1 怜香惜玉 解题报告
怜香惜玉 题意: 已知 \(f(x)=\frac{2 \times \sum_{(i,x)=1}^x i}{φ(x)}\) 先给定数据组数\(t\)和\(k\) 每组数据给出\(n\),求\(\sum ...
- 安徽师大附中%你赛day2T3 巧克力 解题报告
巧克力 题目描述 小\(T\)有\(N\)块巧克力, 每块巧克力上都有一句话(由小写英文字母组成,不含标点) .现在每块巧克力都断成了若干截,更糟糕的是,有一些碎片丢失了 ,但是剩下的碎片之间的顺序是 ...
- 安徽师大附中%你赛day9 T2 富 解题报告
富 题目背景 出于某些原因, 苟先生在追杀富先生. 题目描述 富先生所在的地方是一个\(n\times m\)的网格,苟先生排出了他的狼狗大军,共有\(k\)条狗,第\(i\)条狗所在的位置为\((x ...
- 安徽师大附中%你赛day7 T2 乘积 解题报告
乘积 题目背景 \(\mathrm{Smart}\) 最近在潜心研究数学, 他发现了一类很有趣的数字, 叫做无平方因子数. 也就是这一类数字不能够被任意一个质数的平方整除, 比如\(6\).\(7\) ...
- 安徽师大附中%你赛day4T2 演讲解题报告
演讲 题目背景: 众所周知,\(\mathrm{Zdrcl}\)是一名天天\(\mathrm{AK}\)的高水平选手. 作为一民长者,为了向大家讲述自己\(\mathrm{AK}\)的经验,他决定在一 ...
- 安徽师大附中%你赛day4T1 金字塔 解题报告
金字塔 题目背景: \(Zdrcl\)带着妹子们来到了胡夫金字塔周边旅游, 发现这里正在进行一个有关金字塔的游戏 题目描述: 游戏规则如下: 1. 这里的金字塔是一个 \(N\) 阶的二维金字塔. 2 ...
- SCNU 2015ACM新生赛初赛【1006. 3D打印】解题报告
题目链接详见SCNU 2015新生网络赛 1006. 3D打印 .出题思路来自codevs 3288. 积木大赛,属于模拟题. 首先我们把“选择从第L部分到第R部分”理 ...
随机推荐
- 9.1 IIC驱动源码分析
学习目标:分析linux内核源码下的i2c总线驱动 drivers/i2c/busses/i2c-s3c2410.c 和 driver/i2c/chips/eeprom.c 设备驱动: 一.i2c驱动 ...
- linux文件操作篇 (四) 目录操作
#include <sys/stat.h>#include <unistd.h>#include <dirent.h> //创建文件夹 路径 掩码 int mkdi ...
- codeblocks编译出错问题的解答!(编译c++ 或者c程序)
典型错误:https://blog.csdn.net/jingmiaa/article/details/52054204 MinGW下载并配置gcc/g++编译环境:https://blog.csdn ...
- 7.Mongodb复制(副本集)
1.复制 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性 复制还允许从硬件故障和服务中断中恢复数据 为什么要复制 数据备份 数据灾难恢复 ...
- 4364: [IOI2014]wall砖墙
4364: [IOI2014]wall砖墙 链接 分析: 线段树,维护一个最大值,一个最小值. 代码: #include<bits/stdc++.h> ],*p1 = buf,*p2 = ...
- torndb在python3中运用
#连接数据库:db = torndb.Connect() #查询一条的数据get() #查询多行的数据query() #创建数据表,数据库execute() #插入一条数据:sql = "i ...
- APIO2018 游记
day \(-\infty\) \(\sim\) day0 5 月 5 号左右的时候去了趟中北大学,山西省大学生程序设计竞赛.不是太满意,现场 rk3.拿到了充电宝(冲着这个去的,虽然抵不过车费),抽 ...
- 线段树简单入门 (含普通线段树, zkw线段树, 主席树)
线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...
- Python|花了一天,为大家整理的一套来自外国大佬的密码速查表
简单的HTTPS服务器 检查证书信息 输出 生成自签名证书 输出 准备一个签名注册请求 输出 生成无密码的RSA秘钥文件 用一个私钥给文件签名 输出 从签名验证一个文件 输出 通过pem文件做RSA加 ...
- 【Linux运维】Centos7上借助ansible搭建LVS+Keepalived
安装ansible 安装ansible: [root@localhost ~]# /etc/hosts 192.168.19.129 web129.yanglt.com web129 192.168. ...