社区讨论

求大佬优化

AT_agc019_d [AGC019D] Shift and Flip参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lobmu8nt
此快照首次捕获于
2023/10/29 23:35
2 年前
此快照最后确认于
2023/11/04 04:23
2 年前
查看原帖
CPP
//#pragma GCC optimize(2)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char A[2005];
char B[2005];
int n;
bool bc[2005];
int L[2005],R[2005];
int ans=1e9;
int s[2005],pos;
int cnta,cntb;

bool cmpR(int a,int b){return R[a]<R[b];}
bool cmpL(int a,int b){return L[a]<L[b];}

void solve(){
	for(int i=1;i<=n;i++)
		cnta+=(A[i]=='1'),cntb+=(B[i]=='1');
	if(cntb==0){
//		puts("czz");
		if(cnta==0) printf("0\n");
		else printf("-1\n");
		return ;
	}
	
	for(int i=1;i<=n;i++){
		int cnt=0;
		for(int j=i;B[j]!='1';j--,cnt++)
			if(j==1) j=n+1;
		L[i]=cnt;
		cnt=0;
		for(int j=i;B[j]!='1';j++,cnt++)
			if(j==n+1) j=1;
		R[i]=cnt;
	}
//	for(int i=1;i<=n;i++) printf("%d %d %d\n",i,L[i],R[i]);
	for(int i=1;i<=n;i++){
		int minn=1e9,maxx=0;
		int z=(i==1?0:n-i+1),sum=0;
		for(int j=1;j<=n;j++) bc[j]=0; 
		for(int j=1,k=i;j<=n;j++,k++){
			if(k>n) k-=n;
			if(B[k]!=A[j]) bc[j]=1,sum++;
		}
//		printf("%d\n",sum);
		pos=0;
		for(int j=1;j<=n;j++)
			if(bc[j] && L[j]>z) s[++pos]=j;
		sort(s+1,s+1+pos,cmpR);
		if(pos){
			minn=min(minn,R[s[pos]]*2+z);
			maxx=L[s[pos]];
			for(int j=pos-1;j>0;j--){
				minn=min(minn,R[s[j]]*2+maxx*2-z);
				maxx=max(maxx,L[s[j]]);
			}
			minn=min(maxx*2-z,minn);
		}
		else minn=z;
//		printf("L\n%d %d\n",i,minn);
		ans=min(ans,minn+sum);
		minn=1e9,maxx=0,z=i-1;
		pos=0;
		for(int j=1;j<=n;j++)
			if(bc[j]==1 && R[j]>z) s[++pos]=j;
		sort(s+1,s+1+pos,cmpL);
		if(pos){
			minn=min(minn,L[s[pos]]*2+z);
			maxx=R[s[pos]];
			for(int j=pos-1;j>0;j--){
				minn=min(minn,L[s[j]]*2+maxx*2-z);
				maxx=max(maxx,R[s[j]]);
			}
			minn=min(maxx*2-z,minn);
		}
		else minn=z;
//		printf("R\n%d %d\n",i,minn);
		ans=min(ans,minn+sum);
	}
	printf("%d\n",ans);
} 

int main(){
//	freopen("ring.in","r",stdin);
//  	freopen("ring.out","w",stdout);
	scanf("%s%s",A+1,B+1);
	n=strlen(A+1);
//	for(int i=1;i<=n;i++) putchar(A[i]);
//	puts("");
//	for(int i=1;i<=n;i++) putchar(B[i]); 
	solve();
	return 0;
}
rt,不知道为啥一直T3个点

回复

1 条回复,欢迎继续交流。

正在加载回复...