萌新求调,不懂为什么WA
查看原帖
萌新求调,不懂为什么WA
555345
Hell0_W0rld楼主2024/6/8 22:06
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define rep(i,l,r) for(register ll i=(l);i<=(r);++i)
#define Rep(i,l,r) for(register ll i=(r);i>=(l);--i)
#define all(x) x.begin(),x.end()
using namespace std;
const ll N=200009,INF=1e18;
ll f[21][1<<21],d[21][21],n;
string s[21],t[21];
ll nxt[N];
ll TSP(){
	ll nPtn=(1ll<<n+1);
	rep(i,0,n)rep(p,0,nPtn-1)f[i][p]=INF;
	f[0][1]=0;
	map<ll,ll>LOG2;
	rep(i,0,15)LOG2[1ll<<i]=i;
	for(ll p=1;p<nPtn;p++)
		for(ll s=p;s;s&=(s-1)){
			ll LSB_s=s&(-s);
			ll i=LOG2[LSB_s];
			ll q=LSB_s^p;
			for(ll t=q;t;t&=(t-1)){
				ll j=LOG2[t&(-t)];
				f[i][p]=min(f[i][p],f[j][q]+d[j][i]);
			}
		}
	ll ans=INF;
	rep(i,1,n)ans=min(ans,f[i][nPtn-1]);
	return ans;
}
void KMP(string ptn){
	ll lP=ptn.size();
	ptn=' '+ptn;
	rep(i,1,lP)nxt[i]=0;
	for(ll iP=2,j=0;iP<=lP;iP++){
		while(j&&ptn[j+1]!=ptn[iP])j=nxt[j];
		if(ptn[j+1]==ptn[iP])j++;
		nxt[iP]=j;
	}
}
bool inced[30];
int main(){
	cin>>n;
	rep(i,1,n)cin>>s[i];
	rep(i,1,n)rep(j,1,n)if(i!=j&&s[j].size()<s[i].size()){
		KMP(s[j]);string ptn=' '+s[j],txt=' '+s[i];
		ll iP=0;
		ll lT=s[i].size(),lP=s[j].size();
		for(ll iT=1;iT<=lT;iT++){
			while(iP&&txt[iT]!=ptn[iP+1])iP=nxt[iP];
			if(txt[iT]==ptn[iP+1])iP++;
			if(iP==lP){inced[j]=1; break;}
		}
	}
	
	ll m=0;
	rep(i,1,n){if(!inced[i])t[++m]=s[i];s[i]="";}
	n=m; rep(i,1,n)s[i]=t[i];
//	cout<<n<<endl;
//	rep(i,1,n)cout<<s[i]<<endl;
	
	rep(i,1,n)d[0][i]=s[i].size();
	rep(i,1,n){
		rep(j,1,n)
			if(i!=j){
				string x=s[j]+s[i];
				KMP(x);
				ll len=x.size();
				ll lmt=min(s[i].size(),s[j].size());
				while(len>lmt)len=nxt[len];
				d[i][j]=s[j].size()-len;
//				cout<<d[i][j]<<" ";
			}
//			else cout<<"  ";
//		cout<<endl;
	}
	cout<<TSP()<<endl;
	return 0;
}
2024/6/8 22:06
加载中...