QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#107048#5307. Subgraph IsomorphismSmallBlackWA 3ms5712kbC++142.3kb2023-05-20 09:47:502023-05-20 09:47:51

Judging History

你现在查看的是测评时间为 2023-05-20 09:47:51 的历史记录

  • [2023-10-15 17:25:21]
  • 管理员手动重测本题所有提交记录
  • 测评结果:WA
  • 用时:0ms
  • 内存:5976kb
  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-20 09:47:51]
  • 评测
  • 测评结果:0
  • 用时:3ms
  • 内存:5712kb
  • [2023-05-20 09:47:50]
  • 提交

answer

// Problem: D - Subgraph Isomorphism
// Contest: Virtual Judge - 过什么520做题要紧
// URL: https://vjudge.net/contest/559671#problem/D
// Memory Limit: 1024 MB
// Time Limit: 3000 ms
// Date:2023-05-20 07:53:15
// By:SmallBlack
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
	long long s=0,k=1;
	char c=getchar();
	while(!isdigit(c))
	{
		k=(c=='-')?-1:1;
		c=getchar();
	}
	while(isdigit(c))
	{
		s=s*10+c-'0';
		c=getchar();
	}
	return s*k;
}
#define d read()
#define ll long long
#define ull unsigned long long
#define Maxn 10010
#define Size 100010
#define mp make_pair
#define pb push_back
#define fi first
#define se second
vector<ll>e[Size];
vector<ll>st,loop,LP;
bool ins[Size],fin=0;
void dfs(ll u,ll fa)
{
	ins[u]=1,st.pb(u);
	for(auto v:e[u])
	{
		if(v==fa) continue;
		if(ins[v])
		{
			while(st.back()!=v)
			{
				loop.pb(st.back());
				st.pop_back();
			}
			loop.pb(v);
			fin=1;
			return;
		}
		dfs(v,u);
		if(fin) return;
	}
	st.pop_back(),ins[u]=0;
}
ull mask;
ull shift(ull x)
{
	x=x^mask^((x^mask)<<13),x^=x>>7,x^=x<<17;
	return x^mask;
}
ull tag[Size];
void Hash(ll u,ll fa)
{
	tag[u]=1;
	for(auto v:e[u])
	{
		if(v==fa||ins[v]) continue;
		Hash(v,u);
		tag[u]+=shift(tag[v]);
	}
}
ll t;
void solve()
{
	ll n=d,m=d;
	mask=std::chrono::steady_clock::now().time_since_epoch().count()*(n+m);
	for(int i=1;i<=n;i++) e[i].clear(),ins[i]=0,tag[i]=0;
	for(int i=0;i<m;i++)
	{
		ll x=d,y=d;
		e[x].pb(y),e[y].pb(x);
	}
	if(m==n-1) return (void)puts("YES");
	else if(m>n) return (void)puts("NO");
	fin=0,st.clear(),loop.clear(),dfs(1,0);
	for(int i=1;i<=n;i++) ins[i]=0;
	for(auto x:loop) ins[x]=1;
	if(loop.size()==n) return (void)puts("YES");
	LP.clear();
	for(int i=0;i<loop.size();i++)
		if(e[loop[i]].size()>2) Hash(loop[i],0),LP.pb(i);
	// if(LP.size()<2) return (void)puts("NO");
	if(LP[1]-LP[0]>2) return (void)puts("NO");
	// if(LP[0]+loop.size()-LP[LP.size()-1]!=LP[1]-LP[0])
		// return (void)puts("NO");
	for(int i=2;i<LP.size();i++)
		if(LP[i]-LP[i-1]!=LP[1]-LP[0])
			return (void)puts("NO");
	for(int i=1;i<LP.size();i++)
		if(tag[loop[LP[i]]]!=tag[loop[LP[0]]])
			return (void)puts("NO");
	puts("YES");
}
int main()
{
	t=d;
	while(t--) solve();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 3ms
memory: 5712kb

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]