Submission #365171

#TimeUsernameProblemLanguageResultExecution timeMemory
365171arnold518Solitaire (JOI16_solitaire)C++14
12 / 100
6 ms768 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 6000;
const ll MOD = 1e9+7;

int N, cnt;
char S[4][MAXN+10];
int A[4][MAXN+10];
ll fac[MAXN+10], ifac[MAXN+10];

vector<int> V[MAXN+10];
vector<int> adj[MAXN+10];
ll ans;

ll mypow(ll x, ll y)
{
	if(y==0) return 1;
	if(y%2) return mypow(x, y-1)*x%MOD;
	ll t=mypow(x, y/2);
	return t*t%MOD;
}

ll inv(ll x)
{
	return mypow(x, MOD-2);
}

bool vis[MAXN+10];

bool chk[MAXN+10];
bool f(vector<int> VV)
{
	for(auto it : VV) chk[it]=0;
	for(auto it : VV)
	{
		if(V[it].empty())
		{
			chk[it]=true;
			continue;
		}
		bool flag=false;
		for(auto jt : V[it])
		{
			if(chk[jt]) flag=true;
		}
		if(!flag) return false;
		chk[it]=true;
	}
	return true;
}

int main()
{
	fac[0]=1; ifac[0]=1;
	for(int i=1; i<=MAXN; i++) fac[i]=fac[i-1]*i%MOD;
	for(int i=1; i<=MAXN; i++) ifac[i]=inv(fac[i]);

	scanf("%d", &N);
	scanf(" %s", S[1]+1);
	scanf(" %s", S[2]+1);
	scanf(" %s", S[3]+1);
	for(int i=1; i<=N; i++)
	{
		A[1][i]=(S[1][i]=='x');
		A[2][i]=(S[2][i]=='x');
		A[3][i]=(S[3][i]=='x');
	}

	A[1][0]=1; A[1][N+1]=1;
	A[2][0]=1; A[2][N+1]=1;
	A[3][0]=1; A[3][N+1]=1;
	for(int i=1; i<=N; i++)
	{
		if(A[1][i])
		{
			if(A[1][i-1] || A[1][i+1])
			{
				return !printf("0\n");
			}
		}
	}
	for(int i=1; i<=N; i++)
	{
		if(A[3][i])
		{
			if(A[3][i-1] || A[3][i+1])
			{
				return !printf("0\n");
			}
		}
	}

	for(int i=1; i<=3; i++) for(int j=1; j<=N; j++) if(A[i][j]) cnt++;

	for(int i=1; i<=N; i++) if(A[1][i]) A[1][i]++;
	for(int i=1; i<=N; i++) if(A[3][i]) A[3][i]++;

	for(int i=1; i<=N; i++)
	{
		if(A[2][i]==0) continue;
		if(A[1][i]==0 && A[3][i]==0) A[2][i]=2;
		if(A[2][i-1]==0 && A[2][i+1]==0) A[2][i]=2;

		if(A[2][i]==1)
		{
			if(A[1][i])
			{
				V[i+N].push_back(i);
				adj[i+N].push_back(i);
				adj[i].push_back(i+N);
			}
			if(A[3][i])
			{
				V[i+N].push_back(i+N+N);
				adj[i+N].push_back(i+N+N);
				adj[i+N+N].push_back(i+N);
			}
			if(A[2][i-1])
			{
				V[i+N].push_back(i+N-1);
				adj[i+N].push_back(i+N-1);
				adj[i+N-1].push_back(i+N);
			}
			if(A[2][i+1])
			{
				V[i+N].push_back(i+N+1);
				adj[i+N].push_back(i+N+1);
				adj[i+N+1].push_back(i+N);
			}
		}
	}

	ans=fac[cnt];
	for(int i=1; i<=N; i++)
	{
		if(A[2][i]==0) continue;
		if(vis[i+N]) continue;

		vector<int> VV;
		queue<int> Q;
		vis[i+N]=1;
		Q.push(i+N);
		while(!Q.empty())
		{
			int now=Q.front(); Q.pop();
			VV.push_back(now);
			for(auto nxt : adj[now])
			{
				if(vis[nxt]) continue;
				vis[nxt]=true;
				Q.push(nxt);
			}
		}
		ans=ans*ifac[VV.size()]%MOD;

		int t=0;
		sort(VV.begin(), VV.end());
		do
		{
			t+=f(VV);
		}while(next_permutation(VV.begin(), VV.end()));
		//for(auto it : VV) printf("%d ", it); printf(" : %d\n", t);
		ans=ans*t%MOD;
	}	
	printf("%lld\n", ans);
}

Compilation message (stderr)

solitaire.cpp: In function 'int main()':
solitaire.cpp:63:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   63 |  scanf("%d", &N);
      |  ~~~~~^~~~~~~~~~
solitaire.cpp:64:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   64 |  scanf(" %s", S[1]+1);
      |  ~~~~~^~~~~~~~~~~~~~~
solitaire.cpp:65:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   65 |  scanf(" %s", S[2]+1);
      |  ~~~~~^~~~~~~~~~~~~~~
solitaire.cpp:66:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   66 |  scanf(" %s", S[3]+1);
      |  ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...