记录编号 252373 评测结果 AAAAAAAAAA
题目名称 退票 最终得分 100
用户昵称 GravatarSatoshi 是否通过 通过
代码语言 C++ 运行时间 1.871 s
提交时间 2016-04-20 10:48:59 内存使用 6.67 MiB
显示代码纯文本
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define N 220
#define M 500010
using namespace std;
typedef long long ll;
//constant factor
ll INF=(1ll<<55);
ll hashmod=149;

int n,m,L[N]={0},R[N]={0};
ll f[N][N]={0},hash[M]={0},po[M]={0};
char s[M]={0};
int len=0;
ll MIN(ll a,ll b)
{
	if(a<b)return a;
	return b;
}
class MT
{
public:
	ll s[N][N];
	void full(ll c)
	{
		int i,j;
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
			{
				s[i][j]=c;
			}
		}
	}
	MT()
	{
		full(0);
	}
	void print()
	{
		int i,j;
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
		    {
				cout<<s[i][j]<<' ';
			}
			cout<<endl;
		}
	}
	MT operator *(MT b)
	{
		MT c;
		c.full(INF);
		int i,j,k;
		for(k=1;k<=n;k++)
		{
			for(i=1;i<=n;i++)
			{
				for(j=1;j<=n;j++)
				{
					c.s[i][j]=MIN(c.s[i][j],s[i][k]+b.s[k][j]);
				}
			}
		}
		return c;
	}
}trans;
MT quickpow(MT a,ll k)
{
	MT c;
	c=a;
	k--;
	while(k)
	{
		if(k&1)c=c*a;
		a=a*a;
		k>>=1;
	}
	return c;
}
ll MTmin(MT a)
{
	ll sum=INF;
	int i,j;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			sum=MIN(sum,a.s[i][j]);
		}
	}
	return sum;
}
ll Hash(int l,int r)
{
	return hash[r]-hash[l-1]*po[r-l+1];
}
void read()
{
	scanf("%d%d",&n,&m);
	len=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%s",s+len+1);
		L[i]=len+1;
		R[i]=len=strlen(s+1);
		//cout<<L[i]<<' '<<R[i]<<endl;
	}
}
void init()
{
	int i,j,k,l;
	po[0]=1;
	for(i=1;i<=len;i++)hash[i]=hash[i-1]*hashmod+s[i],po[i]=po[i-1]*hashmod;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			l=min(R[i]-L[i]+1,R[j]-L[j]+1);
			if(i==j)l--;
			f[i][j]=R[j]-L[j]+1;
			//cout<<f[i][j]<<' '<<endl;
			for(k=l;k>=1;k--)
			{
				if(Hash(R[i]-k+1,R[i])==Hash(L[j],L[j]+k-1))
				{
					f[i][j]-=k;
					break;
				}
			}
		}
	}
}
MT temp;
void work()
{
	int i,j;
	MT ans;
	memcpy(trans.s,f,sizeof(trans.s));
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(i==j)ans.s[i][j]=R[i]-L[i]+1;
			else ans.s[i][j]=INF;
		}
	}
	/*for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			cout<<f[i][j]<<' ';
		}
		cout<<endl;
	}
	trans.print();*/
	//ans.print();
	if(m>1)temp=quickpow(trans,m-1);
	ans=ans*temp;
	//temp.print();
	cout<<MTmin(ans)<<endl;
}
int main()
{
	freopen("ticketa.in", "r", stdin);
    freopen("ticketa.out", "w", stdout);
	read();
	init();
	work();
	return 0;
}