QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#107759#5307. Subgraph IsomorphismshihoghmeanWA 14ms38792kbC++173.2kb2023-05-22 18:58:122023-10-15 17:25:47

Judging History

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

  • [2023-10-15 17:25:47]
  • 管理员手动重测本题所有提交记录
  • 测评结果:WA
  • 用时:14ms
  • 内存:38792kb
  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-22 18:58:16]
  • 评测
  • 测评结果:0
  • 用时:28ms
  • 内存:20436kb
  • [2023-05-22 18:58:12]
  • 提交

answer

// Problem: G. Subgraph Isomorphism
// Contest: Codeforces - The 2022 ICPC Asia Hangzhou Regional Programming Contest
// URL: https://codeforces.com/gym/104090/problem/G
// Memory Limit: 1024 MB
// Time Limit: 3000 ms

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
#define ll long long
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fr(i,a,b) for(int i=a;i>=b;i--)
#define py puts("YES")
#define pn puts("NO")
#define pt puts("")
#define pb push_back
#define wt(x) write(x),puts("")
#define wr(x) write(x) ,putchar(' ')
#define tx printf("fds")
#define mp make_pair
#define fi first
#define se second
inline int read(){
	int x=0,k=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') k=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+ch-48;
		ch=getchar();
	}
	return x*k;
}
void write(int x){
	if(x<0){
		x=-x;
		putchar('-');
	}
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
int power(int x,int y,int mod){
	int num=1;
	while(y){
		if(y&1) num=(num*x)%mod;
		x=x*x%mod;
		y>>=1;
	}
	return num;
}
int mul(int x,int y,int mod){
	int num=0;
	while(y){
		if(y&1) num=(num+x)%mod;
		x=(x+x)%mod;
		y>>=1;
	}
	return num;
}
const int N=1e6+7,mod=998244353;
int n,m,tot,tot1;
int head[N];
struct edge{
	int to,next;
}e[N];
void add(int u,int v){
	e[++tot]={v,head[u]};
	head[u]=tot;
}
int vis[N],is_round[N],END,siz[N],st[N],top,f[N];
int Hash[N],bases[N],base=233,Hash1[N];
int p[10000001],prime[N];
void pre(){
    bases[0]=1;
    for(int i=1;i<=1000000;i++){
        bases[i]=bases[i-1]*base;
        int x=rand(),y=rand(),z=rand();
        prime[i]=x<<30+y<<15+z;
    }
}
void dfs(int u,int fa){
	if(vis[u]){
		while(st[top]!=u){
			is_round[st[top]]=1;
			top--;
		}
		is_round[u]=1;
		END=1;
		return ;
	}
	vis[u]=1;
	st[++top]=u;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(v==fa) continue;
		dfs(v,u);
		if(END) return ;
		while(st[top]!=u){
			top--;
		}
	}
}
void dfs1(int u,int fa){
	f[u]=1;
	siz[u]=1;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(is_round[v]||v==fa) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		f[u]+=f[v]*prime[siz[v]];
	}
}
void dfs2(int u,int fa){
	st[++top]=u;
	vis[u]=1;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(v==fa||vis[v]||!is_round[v]) continue;
		dfs2(v,u);
	}
}
bool solve(){
	fo(i,1,n) vis[i]=0,is_round[i]=0,siz[i]=0,f[i]=0;
	END=0;
	top=0;
	dfs(1,0);
	top=0;
	fo(u,1,n){
		if(is_round[u]) dfs1(u,0);
		vis[u]=0;
	}
	fo(u,1,n){
		if(is_round[u]){
			dfs2(u,0);
			break;
		}
	}
    fo(i,1,top+1) Hash[i]=0,Hash1[i]=0;
	fo(i,1,top){
        Hash[i]=Hash[i-1]*base+f[st[i]];
    }
    fr(i,top,1){
    
        Hash1[i]=Hash1[i+1]*base+f[st[i]];
    }
    fo(i,2,top){
        int o=(Hash[top]-Hash[i-1]*bases[top-i+1])*bases[i-1]+Hash[i-1];
        if(Hash[top]!=o&&o!=Hash1[1]) return false; 
    }
    return true;
}
signed main(){
	pre();
	int tt=read();
	while(tt--){
		n=read();m=read();
		fo(i,0,tot) head[i]=0;
		tot=0;
		fo(i,1,m){
			int x=read(),y=read();
			add(x,y);add(y,x);
		}
		if(m==n-1){
			py;
			continue;
		}
		if(m>n){
			pn;
			continue;
		}
		if(solve()) py;
		else pn;
	}
	return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 14ms
memory: 38792kb

input:

4
7 6
1 2
2 3
3 4
4 5
5 6
3 7
3 3
1 2
2 3
3 1
5 5
1 2
2 3
3 4
4 1
1 5
1 0

output:

YES
YES
YES
YES

result:

wrong answer expected NO, found YES [3rd token]