社区讨论

关于ARC的B,O(n)做法TLE

学术版参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lzfnpaqb
此快照首次捕获于
2024/08/04 22:27
2 年前
此快照最后确认于
2024/08/05 08:44
2 年前
查看原帖
求助,这玩意为什么会TLE
CPP
#include<bits/stdc++.h>
using namespace std;
//#define int long long
int t,cnt1,cnt2,l0,l1;
char s[500050],x[500050],y[500050];
//string s,x,y;
int gcd(int a,int b){
	if(a<b)swap(a,b);
//	cout<<"gcd:"<<a<<" "<<b<<endl;
	if(b==0)return a;
	else return gcd(b,a%b);
}
signed main(){
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	scanf("%d",&t);
	while(t--){
		scanf("%s%s%s",s+1,x+1,y+1);
		cnt1=cnt2=0;
		int ls=strlen(s+1),lx=strlen(x+1),ly=strlen(y+1);
		for(int i=1;i<=lx;i++){
			if(x[i]=='0')cnt1++;
		}
		for(int i=1;i<=ly;i++){
			if(y[i]=='0')cnt2++;
		}
		if(cnt1==cnt2){
			printf("Yes\n");
//			cout<<"Yes"<<'\n';
			continue;
		}
		int l0=cnt2-cnt1,l1=(lx-cnt1)-(ly-cnt2);
		if(l1==0){
			printf("No\n");
			continue;
		}
		if(l0<0){
			if(l1<0){
				l0=-l0;
				l1=-l1;
			}
			else {
				printf("No\n");
				continue;
			}
		}
		int g=gcd(l0,l1);
		l0/=g,l1/=g;
		if(l1==1){
			printf("Yes\n");
			continue;
		}
		if(ls%l1){
			printf("No\n");
			continue;
		}
		else {
			int len=ls/l1;
//			cout<<len<<endl;
			bool flag=1;
			for(int i=1;i*len<=ls;i++){
				if(!flag)break;
				for(int j=1;j<=len&&i*len+j<=ls;j++){
//					cout<<j<<" "<<i*len+j<<endl;
					if(!flag)break;
					if(s[i*len+j]!=s[j]){
						printf("No\n");
						flag=0;
						break;						
					}
				}
			}
			if(flag)printf("Yes\n");
		}
	}
	return 0;
}

回复

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

正在加载回复...