[POI2010]CHO-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/…
[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的方法 我…
设g[i][j]为i串至少加上几个字符后才能包含j,可以通过Hash求出. 然后就是求经过m-1条边的最短路,用倍增加速Floyed即可,时间复杂度$O(n^3\log m)$. #include<cstdio> #include<cstring> #define rep(i,n) for(int i=0;i<n;i++) typedef long long ll; typedef unsigned int U; const int N=200,M=100010,P=31;…
题目描述 Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多少个名字,请你求出最短的字母序列的长度是多少.n个字符串保证不互相包含. 输入 输入:第一行n(1<=n<=200)和m(1<=m<=10的9此方),n表示有多少个仓鼠,m表示Tz希望出现名字的次数,接下来n行,每行都是仓鼠的名字(中间没有空格). 输出 输出:一行,最短的字母序列的长度. 样例输入 4…
题面 Description Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多少个名字,请你求出最短的字母序列的长度是多少. Input 输入:第一行n(1<=n<=200)和m(1<=m<=10的9此方),n表示有多少个仓鼠,m表示Tz希望出现名字的次数,接下来n行,每行都是仓鼠的名字(中间没有空格). Output 输出:一行,最短的字母序列的长度. Sam…
数组开小毁一生-- 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2085 这题在洛谷上有个条件是"互不包含",其实bzoj的数据也满足这个条件,否则我目前已知的所有做法都是错的. 个人觉得AC自动机可以用其他办法做,但是没试过 KMP(或者hash), \(f[i][j]\)表示\(i\)完了接上\(j\)需要多少个字符,直接用KMP求出最长的同时是\(j\)串的前缀和\(i\)串的后缀的串即可 然后求走\((m-1)\…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2085 题解 考虑暴力 DP 的做法.令 \(dp[i][j]\) 表示以 \(j\) 为开头的子串,并且已经总共出现 \(i\) 次的最小长度. \[ dp[i][j] = \min_{k=1}^n\{dp[i-1][k] + len_j - LC(j, k) \} \] 其中 \(LC(j, k)\) 表示最长的 \(j\) 的后缀等于 \(k\) 的前缀. 然后这个东西可以用矩阵来加速.…
2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Status][Discuss] Description 一个铁路包含两个侧线1和2,右边由A进入,左边由B出去(看下面的图片)    有n个车厢在通道A上,编号为1到n,它们被安排按照要求的顺序(a1,a2,a3,a4....an)进入侧线,进去还要出来,它们要按照编号顺序(1,2,3,4,5....n)从…
Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不满足>_>(中间那个字符无论如何不反对称) 那么我们就找'#'为中心的即可…… 将判断条件a[i-p[i]-1]==a[i+p[i]+1]改成[不等……或是两个都是'#'] 将所有的p[i]加起来,即所有“反回文串”的长度加起来除以二就是答案啦~ 看代码吧>_< /**********…
题解: 想了想发现只需要求出最长的一段平均值>k即可. 平均值的问题给每个数减去k,判断是否连续的一段>0即可. 然后我们发现如果i<j 且 s[i]<s[j],那么 j 对于l>j不会比i 优. 那我们就可以维护一个单调的s[i],然后对于每个l去二分出它的答案. 但这样会T. 再次考虑单调性. 如果 l>j,且s[l]>s[i],那么我们的答案最小也是l-i,所以j必须取比i小的s才有可能更新答案.然后就可以两个指针扫一遍了. 好吧 我承认我口胡... 代码:…