求剪枝思路
查看原帖
求剪枝思路
654958
Light_az楼主2023/4/19 21:18

太弱了以至于没有思路,求优化 )

#include<bits/stdc++.h>
#define ll long long
#define F(i,j,n) for(int i=j;i<=n;i++)
#define F1(i,j,n) for(int i=j;i>=n;i--)
#define Tr(v,e) for(int v:e)
#define D double
#define ps push_back
#define Test ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
const int N=1e6+10,NN=1e4+10;
ll n,m,k,x,y,u,v,w,cnt=0,ans=0,t=0,l,r,len,T;
ll mini=INT_MAX,maxi=0,p=998244353;
char s1[N],s2[N],s3[N];
ll a[N],b[N],vis[N];
void print(){
	F(i,'A','A'+n-1) cout<<a[i]<<" ";
	cout<<"\n";
}
void Ask(){
	ll last=0;
	F1(i,n-1,0){
		if((a[s1[i]]+a[s2[i]]+last)%n!=a[s3[i]]) return ;
		last=(a[s1[i]]+a[s2[i]]+last)/n;
	}
	print();
	exit(0);
}
bool check(){
	F1(i,n-1,0){
		if(a[s1[i]]==-1||a[s2[i]]==-1||a[s3[i]]==-1) continue;
		if((a[s1[i]]+a[s2[i]])%n!=a[s3[i]]&&(a[s1[i]]+a[s2[i]]+1)%n!=a[s3[i]]) return 0;
	}
	return 1;
}
void dfs(ll step){
	if(step>n){
		Ask();
		return ;
	}
	F(i,0,n-1){		
		if(!vis[i]&&check()){
			vis[i]=1;
			a[step+'A'-1]=i; 
			dfs(step+1);
			a[step+'A'-1]=-1;
			vis[i]=0;
		}
	}
	a[step+'A'-1]=-1;
}
int main(){
    Test;
	cin>>n>>s1>>s2>>s3;
	dfs(1);
	return 0;
}
2023/4/19 21:18
加载中...