求助,本地RE,洛谷AC
查看原帖
求助,本地RE,洛谷AC
1037072
yhl110804楼主2024/8/5 09:03
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1005;
const int F=1e14;
string s[N];
int nxt[N][N];
int len[N];
int n,m;
inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
struct nd {
	int v[300][300];
} ans,a;
nd operator * (nd a,nd b) {
	nd c;
	for(int i=0; i<=n; i++)
		for(int j=0; j<=n; j++)
			c.v[i][j]=F;
	for(int i=0; i<=n; i++) {
		for(int j=0; j<=n; j++) {
			for(int k=0; k<=n; k++) {
				c.v[i][k]=min(c.v[i][k],a.v[i][j]+b.v[j][k]);
			}
		}
	}
	return c;
}


void pa1() {
	for(int i=1; i<=n; ++i)
		if(len[i]==1) {
			cout<<m;
			return;
		}
}
void KMP() {
	a.v[0][0]=F;
	for(int i=1; i<=n; ++i)a.v[0][i]=len[i],a.v[i][0]=F;
//	cout<<"!!"<<endl;
	for(int i=1; i<=n; ++i) {
		//	cout<<i<<"\n";
		int k=0;
		for(int j=2; j<=len[i]; j++) {
			while(k&&s[i][k+1]!=s[i][j])k=nxt[i][k];
			if(s[i][k+1]==s[i][j])k++;
			nxt[i][j]=k;
			//		cout<<k<<"\n";
		}
	}
//	cout<<"!!"<<endl;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			//	if(i==j)continue;
			int l=0;
			for(int k=2; k<=len[i]; k++) {

				while(l&&s[j][l+1]!=s[i][k])l=nxt[j][l];
				if(s[j][l+1]==s[i][k])l++;
				if(k==len[i]) a.v[i][j]=len[j]-l;
				//cout<<k<<"\n";
			}
		}
	}
//	cout<<"^&*(%^%E$)!!"<<endl<<"\n";
}
void op() {
//	cerr<<"ksm"<<endl;
//	cout<<"!!"<<endl;
	m--;
	for(int i=0; i<=n; i++)
		for(int j=0; j<=n; j++)
			ans.v[i][j]=a.v[i][j];
		//	cout<<"LL"<<endl;
	while(m) {
	//	cout<<"&%&%^#&$%^&$%&%$&"<<endl;
		if(m&1)ans=ans*a;
		a=a*a;
		m>>=1;
	}
}
signed main() {
	cin>>n>>m;
	for(int i=1; i<=n; ++i) {
		cin>>s[i];
		len[i]=s[i].size();
		s[i]=" "+s[i];
	}
	
	//cout<<"!!!";
	pa1();
	
	KMP();
//	cout<<"kmp ok"<<endl;
//	cout<<"&&"<<endl;
	op();
	//cout<<"!!!!!!!!!!!!!!!!!"<<endl; 
	//cout<<"LLLL"<<endl; 
	int aans=1e9;
	for(int i=1; i<=n; i++)aans=min(aans,ans.v[0][i]);
	cout<<aans;
	return 0;
}

2024/8/5 09:03
加载中...