QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#628148#7900. Gifts from KnowledgeYurily#WA 6ms14028kbC++203.2kb2024-10-10 18:54:232024-10-10 18:54:23

Judging History

你现在查看的是最新测评结果

  • [2024-10-10 18:54:23]
  • 评测
  • 测评结果:WA
  • 用时:6ms
  • 内存:14028kb
  • [2024-10-10 18:54:23]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int MAX=1e6+5;
const long long MOD=1e9+7;
vector<int> a[MAX],g[MAX],g3[MAX],g2[MAX],tmp;
struct edge{
	int nxt,to;
};
edge e[MAX*2];
int n,m,tot,h[MAX];
string s;
int dfn[MAX],cur,fa1[MAX],fa2[MAX],fa3[MAX];
bool vis[MAX],res;
int findf1(int x){
	if(fa1[x]==x)
		return x;
	fa1[x]=findf1(fa1[x]);
	return fa1[x];
}
int findf2(int x){
	if(fa2[x]==x)
		return x;
	fa2[x]=findf2(fa2[x]);
	return fa2[x];
}
int findf3(int x){
	if(fa3[x]==x)
		return x;
	fa3[x]=findf3(fa3[x]);
	return fa3[x];
}
void addedge(int u,int v){
	e[++tot].to=v;
	e[tot].nxt=h[u];
	h[u]=tot;
}
int read(){
	int x = 0, f = 1;
	char c = getchar();
	while(c < '0' || c > '9'){
		if(c == '-'){
			f = -1;
		}
		c = getchar();
	}
	while(c >= '0' && c <= '9'){
		x = x*10+c-'0';
		c = getchar();
	}
	return x*f;
}
void dfs(int u){
	vis[u]=1;
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(!vis[v]){
			dfn[v]=dfn[u]^1;
			dfs(v);
		}
		else{
			if(dfn[u]==dfn[v]){
				res=1;
				return;
			}
		}
	}
}
void solve(){
	tot=0;
	n=read(),m=read();
	memset(vis,0,sizeof(bool)*(n+1));
	memset(dfn,0,sizeof(int)*(n+1));
	memset(h,0,sizeof(int)*(n+1));	
	for(int i=1;i<=n;++i){
		fa1[i]=fa2[i]=fa3[i]=i;
		a[i].clear();
		g3[i].clear();
	}
	for(int i=1;i<=m;++i){
		g[i].clear();
	}	
	int mid=m/2;
	if(m&1)
		mid++;
	for(int i=1;i<=n;++i){
		cin>>s;
		a[i].push_back(0);
		for(int j=1;j<=m;++j){
			if(s[j-1]=='1'){
				a[i].push_back(1);
				if(j<=mid)
					g[j].push_back(i);
				else
					g[m-j+1].push_back(i);
			}
			else
				a[i].push_back(0);
		}
	}
	if((m&1)&&g[mid].size()>1){
		printf("0\n");
		return;
	}
	for(int i=1;i<=mid;++i){
		if((int)g[i].size()<=1)
			continue;
		if((int)g[i].size()>3){
			printf("0\n");
			return;
		}
		for(int j=0;j<g[i].size();++j){
			for(int k=j+1;k<g[i].size();++k){
				int u=g[i][j],v=g[i][k];
				int ra1=findf1(u);
				int rb1=findf1(v);
				int ra2=findf2(u);
				int rb2=findf2(v);
				int ra3=findf3(u);
				int rb3=findf3(v);
				fa1[rb1]=ra1;
				if(a[u][i]==a[v][i]&&a[u][i]==1||a[u][m-i+1]==a[v][m-i+1]&&a[u][m-i+1]==1){
				//	cout<<u<<" "<<v<<endl;
					addedge(u,v);
					addedge(v,u);
					fa2[rb2]=ra2;
				}
				if(a[u][i]==1&&a[u][i]==a[v][m-i+1]||a[u][m-i+1]==1&&a[u][m-i+1]==a[v][i]){
					fa3[rb3]=ra3;
				}
			}
		}
	}
	
	for(int i=1;i<=n;++i){
		g3[findf3(i)].push_back(i);
	}

	for(int i=1;i<=n;++i){
		if(!vis[i]){
			res=0;
			dfs(i);
			if(res){
				printf("0\n");
				return;
			}
		}
	}
	
	for(int i=1;i<=n;++i){
		for(int j=0;j<g3[i].size();++j){
			int u=g3[i][j];
			tmp.push_back(findf2(u));
			g2[findf2(u)].push_back(u);
		}
		bool flag=1;
		for(int j=0;j<tmp.size();++j){
			for(int k=1;k<g2[tmp[j]].size();++k){
				if(dfn[g2[tmp[j]][k]]!=dfn[g2[tmp[j]][0]]){
					flag=0;
					break;
				}
			}
			if(!flag)
				break;
		}
		for(int j=0;j<tmp.size();++j)
			g2[tmp[j]].clear();
		tmp.clear();
		if(!flag){
			printf("0\n");
			return;
		}
	}	
	
	long long ans=1;
	for(int i=1;i<=n;++i){
		if(findf1(i)==i){
			ans=ans*2%MOD;
		}
	}
	printf("%lld\n",ans);	
}
int main(){
	int T;
	cin>>T;
	while(T--){
		solve();
	}
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 6ms
memory: 14028kb

input:

3
3 5
01100
10001
00010
2 1
1
1
2 3
001
001

output:

0
0
2

result:

wrong answer 1st numbers differ - expected: '4', found: '0'