wa on 10求调
查看原帖
wa on 10求调
795784
zxh923楼主2024/3/12 20:10
#include<bits/stdc++.h>
#define int long long
#define N 500005
#define lim 500000
using namespace std;
int t,n,L,sum,cnt,pre[N],dp[N],pos,tmp,zz,ans[N],wz[N],tot,op,top;
char s[N];
bool vis[N];
vector<int>e[N],p;
queue<int>q;
void dfs(int x){
	if(!x){
		return;
	}
	if(!vis[x]&&!(L%x)){
		for(int i=zz;i<=zz+x-1;i++){
			if(i!=zz+x-1)ans[wz[i]]=wz[i+1];
			else ans[wz[i]]=wz[zz];
		}
		zz+=x;
		return;
	}
	for(int y:e[x]){
		dfs(y);
		dfs(x-y);
		return;
	}
}
signed main(){
	vis[0]=vis[1]=1;
	for(int i=2;i<=lim;i++){
		if(!vis[i]){
			for(int j=i*2;j<=lim;j+=i){
				vis[j]=1;
			}
		}
	}
	cin>>t;
	while(t--){
		op=top=tmp=tot=zz=pos=cnt=sum=0;
		p.clear();
		cin>>n>>L;
		for(int i=1;i<=n;i++){
			cin>>s[i];
			ans[i]=wz[i]=dp[i]=0;
			e[i].clear();
		}
		if(!L){
			for(int i=1;i<n;i++){
				cout<<i+1<<' ';
			}
			cout<<1<<'\n';
			continue;
		}
		for(int i=1;i<=n;i++){
			if(s[i]=='1'){
				p.push_back(i);
				sum++;
				wz[tot++]=i;
			}
			if(!vis[i]&&!(L%i)){
				pre[++cnt]=i;
				dp[i]=1;
			}
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=cnt;j++){
				if(i>=pre[j]){
					if(dp[i-pre[j]])e[i].push_back(i-pre[j]);
					dp[i]=max(dp[i],dp[i-pre[j]]);
				}
			}
		}
		for(int i=sum;i<n-1;i++){
			if(dp[i])pos=i;
		}
		if(dp[n])pos=n;
		if(!pos){
			cout<<"-1\n";
			continue;
		}
		tmp=sum;
		for(int i=1;i<=n;i++){
			if(s[i]=='0'&&tmp<pos){
				tmp++;
				p.push_back(i);
				wz[tot++]=i;
			}
		}
		sort(wz,wz+tot);
		dfs(pos);
		for(int i=1;i<=n;i++){
			if(!ans[i]){
				q.push(i);
			}
		}
		if(!q.empty()){
			op=q.front();
			while(q.size()>1){
				top=q.front();
				q.pop();
				ans[top]=q.front();
			}
			ans[q.front()]=op;
			q.pop();
		}
		for(int i=1;i<=n;i++){
			cout<<ans[i]<<' ';
		}
		cout<<'\n';
	}
	return 0;
}
2024/3/12 20:10
加载中...