BZOJ2085: [Poi2010]Hamsters

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


我们构造这样一个矩阵A:

A[i][j]表示第j个字符串长度-第i个字符串的最长是第j个字符串前缀的后缀长度

也就是说,若当前字符串的末尾是第i个字符串,想让下一个出现的字符串是j的话,需要至少在后面添加多少个字母

由于m很大,我们可以想象用类似矩阵快速幂求方案数的方法类似的来求解,只不过把先乘后加转化成了先加后取min

为什么管这个东西叫倍增floyd....反正我觉得就是矩阵乘法...


#include
#include
#include
using namespace std;
char s[201][100001];
long long n,m;
struct ppp
{
	long long w[201][201];
	void print()
	{
		int i,j;
		for(i=1;i<=n;i++)
		{for(j=1;j<=n;j++) cout<

你可能感兴趣的:(BZOJ,POI,矩阵乘法)