QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#572217#8836. Highway HoaxATM12345TL 6ms32432kbC++173.4kb2024-09-18 13:01:292024-09-18 13:01:36

Judging History

This is the latest submission verdict.

  • [2024-09-18 13:01:36]
  • Judged
  • Verdict: TL
  • Time: 6ms
  • Memory: 32432kb
  • [2024-09-18 13:01:29]
  • Submitted

answer

#include <bits/stdc++.h>
#define ll long long
#define Ma 1000005
#define mod 998244353
#define PLL pair<ll,ll>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define N 61
#define all(x) x.begin(),x.end()
#define pb push_back
#define G 3 
using namespace std;

ll po(ll p,ll x=mod-2)
{
	ll sum=1;
	while (x)
	{
		if (x&1) sum=sum*p%mod;
		p=p*p%mod;
		x>>=1;
	}
	return sum;
}
ll mul[Ma],pre[Ma];

void pri()
{
	mul[0]=1;
	for (ll i=1;i<Ma;i++)
		mul[i]=mul[i-1]*i%mod;
	pre[Ma-1]=po(mul[Ma-1]);
	for (ll i=Ma-2;i>=0;i--)
		pre[i]=pre[i+1]*(i+1)%mod;
	return;
}

ll C(ll x,ll y)
{
	if (x<0||y<0||x>y) return 0;
	return mul[y]*pre[x]%mod*pre[y-x]%mod;
}

ll rev[Ma];

void change(vector <ll> &x,ll len){
	for (ll i=0;i<len;i++){
		rev[i]=rev[i>>1]>>1;
		if (i&1)
			rev[i]|=len>>1;
	}
	for (ll i=0;i<len;i++)
		if (rev[i]<i)
			swap(x[i],x[rev[i]]);
	return;
}

void NTT(vector <ll> &x,ll lim,ll on){
	change(x,lim);
	for (ll h=2;h<=lim;h<<=1){
		ll gn=po(G,(mod-1)/h);
		for (ll j=0;j<lim;j+=h){
			ll g=1;
			for (ll k=j;k<j+h/2;k++,g=g*gn%mod){
				ll tmp=x[k+h/2]*g%mod;
				x[k+h/2]=(x[k]-tmp+mod)%mod;
				x[k]=(x[k]+tmp)%mod;
			}
		}
	}
	if (on==-1){
		reverse(x.begin()+1,x.end());
		ll inv=po(lim);
		for (ll i=0;i<lim;i++) x[i]=x[i]*inv%mod;
	}
	return;
}

vector <ll> M(vector <ll> x,vector <ll> y)
{
	ll len=x.size()+y.size()-1,lim=1;
	while (lim<len) lim<<=1;
	x.resize(lim),y.resize(lim);
	NTT(x,lim,1),NTT(y,lim,1);
	for (ll i=0;i<lim;i++)
		x[i]=x[i]*y[i]%mod;
	NTT(x,lim,-1);
	x.resize(len);
	return x;
}



vector <ll> go(vector <vector<ll>> x)
{
	vector <ll> ans;
	ans.pb(1);
	for (auto z:x)
		ans=M(ans,z);
	return ans;
}

vector <ll> v[Ma];
ll col[Ma];
string s;
ll dp[Ma][2];
ll n;
map <PLL,ll> mp;

void add(ll &x,ll y)
{
	x=(x+y)%mod;
	return;
}

void dfs(ll x,ll pre)
{
	ll tot=0;
	vector <vector <ll>> ent,del;
	for (auto z:v[x])
	{
		if (z==pre)
			continue;
		dfs(z,x);
		if (mp[{z,x}]) ent.pb({dp[z][0],dp[z][1]});
		else	del.pb({dp[z][0],dp[z][1]});
		tot++;
	}
	if (!tot)
	{
		dp[x][0]=1;
		dp[x][1]=(col[x]==1&&mp[{x,pre}]||col[x]==0&&mp[{pre,x}]);
		return;
	}
	vector <ll> l=go(ent),r=go(del);
	for (ll i=0;i<l.size()&&i<r.size();i++)
		add(dp[x][0],l[i]*r[i]);
	if (mp[{x,pre}])//del
	{
		for (ll i=0;i+1<l.size()&&i<r.size();i++)
			add(dp[x][1],l[i+1]*r[i]);
	}
	else//add
	{
		for (ll i=0;i<l.size()&&i+1<r.size();i++)
			add(dp[x][1],l[i]*r[i+1]);
	}
	if (col[x]==1)
	{
		for (ll i=0;i<l.size()&&i+1<r.size();i++)
			add(dp[x][0],l[i]*r[i+1]);
		if (mp[{x,pre}])//del
		{
		for (ll i=0;i<l.size()&&i<r.size();i++)
			add(dp[x][1],l[i]*r[i]);
		}
		else//add
		{
			for (ll i=0;i<l.size()&&i+2<r.size();i++)
				add(dp[x][1],l[i]*r[i+2]);
		}
	}
	else
	{
		for (ll i=0;i+1<l.size()&&i<r.size();i++)
			add(dp[x][0],l[i+1]*r[i]);
		if (mp[{x,pre}])//del
		{
			for (ll i=0;i+2<l.size()&&i<r.size();i++)
				add(dp[x][1],l[i+2]*r[i]);
		}
		else//add
		{
			for (ll i=0;i<l.size()&&i<r.size();i++)
				add(dp[x][1],l[i]*r[i]);
		}
	}
}

void sol(){
	cin>>n>>s;
	for (ll i=1;i<=n;i++)
		col[i]=(s[i-1]=='S');
	for (ll i=1;i<n;i++)
	{
		ll l,r;
		cin>>l>>r;
		v[l].pb(r),v[r].pb(l);
		mp[{l,r}]=1;
	}
	dfs(1,0);
	printf("%lld\n",dp[1][0]);
}


int main()
{
	IOS
	ll tt=1;
	//cin>>tt;
	while (tt--)
		sol();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 5ms
memory: 32424kb

input:

5
SFSFS
2 1
2 3
4 3
4 5

output:

1

result:

ok 1 number(s): "1"

Test #2:

score: 0
Accepted
time: 6ms
memory: 30388kb

input:

4
SFFF
1 2
1 3
1 4

output:

4

result:

ok 1 number(s): "4"

Test #3:

score: 0
Accepted
time: 0ms
memory: 30640kb

input:

7
SSSSFFF
1 2
3 2
4 3
4 5
4 6
2 7

output:

13

result:

ok 1 number(s): "13"

Test #4:

score: 0
Accepted
time: 4ms
memory: 30608kb

input:

2
FS
1 2

output:

1

result:

ok 1 number(s): "1"

Test #5:

score: 0
Accepted
time: 3ms
memory: 32432kb

input:

3
FFF
3 1
3 2

output:

1

result:

ok 1 number(s): "1"

Test #6:

score: 0
Accepted
time: 0ms
memory: 30436kb

input:

4
FFFF
1 2
4 2
2 3

output:

1

result:

ok 1 number(s): "1"

Test #7:

score: 0
Accepted
time: 6ms
memory: 30644kb

input:

5
FFFFF
4 2
2 1
3 1
3 5

output:

1

result:

ok 1 number(s): "1"

Test #8:

score: 0
Accepted
time: 6ms
memory: 30384kb

input:

6
FSSSSF
5 3
2 5
1 2
2 6
4 2

output:

3

result:

ok 1 number(s): "3"

Test #9:

score: -100
Time Limit Exceeded

input:

199995
FSSFFFSSSFSFFSSSFSSSSSFSFSSSFSFFSSFSFSFFFSSSFSSFSFFSFFFFSSFFSSSFFSFSFFFFFFFFFFFFFSSSFSSFFFSSSFSFSSSFFFSFFSFSSSSFSFSFSFSSFFSFSFFSFFSSFSSSFSFFSSSFFSFFFSFFSFSFSFSFSSSFSSSSFFSSFFFFFSFSSSFFSSSSSSSSFFFSFSFFSSSFSFFFFFSFFFFSSSSSSSFFFSFFSFSSSFSFSFFFFSFSSFSSFFFSSFFFSSFSFFFSSSFSFSSFFSFSFFSFFSSFSFSSSSFFF...

output:


result: