QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#628148 | #7900. Gifts from Knowledge | Yurily# | WA | 6ms | 14028kb | C++20 | 3.2kb | 2024-10-10 18:54:23 | 2024-10-10 18:54:23 |
Judging History
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'