QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#461702#8836. Highway HoaxPurslaneRE 3ms21000kbC++142.3kb2024-07-02 23:12:532024-07-02 23:12:53

Judging History

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

  • [2024-07-02 23:12:53]
  • 评测
  • 测评结果:RE
  • 用时:3ms
  • 内存:21000kb
  • [2024-07-02 23:12:53]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=4e5+10,MOD=998244353;
namespace POLY {
	int qpow(int base,int p) {
		int ans=1;
		while(p) {
			if(p&1) ans=ans*base%MOD;
			base=base*base%MOD,p>>=1;
		}
		return ans;
	}
	int rev[MAXN];
	void ntt(vector<int>& f,int k,int op) {
		ffor(i,1,k-1) rev[i]=(rev[i>>1]>>1)|((i&1)*(k>>1));
		ffor(i,1,k-1) if(rev[i]>i) swap(f[i],f[rev[i]]);
		int lst=1,len=1;
		while(len<k) {
			lst=len,len<<=1;
			int omega=qpow(3,(MOD-1)/len);
			if(op==-1) omega=qpow(omega,MOD-2);
			ffor(i,0,k/len-1) {
				int l=i*len,r=l+len-1,tmp=1;
				ffor(j,l,l+lst-1) {
					int x=f[j],y=f[j+lst];
					f[j]=(x+tmp*y)%MOD,f[j+lst]=(x-tmp*y)%MOD,tmp=tmp*omega%MOD;
				}
			}
		}
		if(op==-1) {
			int inv=qpow(k,MOD-2);
			ffor(i,0,k-1) f[i]=f[i]*inv%MOD;
		}
		return ;
	}
	vector<int> mul(vector<int> A,vector<int> B) {
		int k=1;
		while(k<A.size()+B.size()) k<<=1;
		A.resize(k),B.resize(k);
		ntt(A,k,1),ntt(B,k,1);
		ffor(i,0,k-1) A[i]=A[i]*B[i]%MOD;
		ntt(A,k,-1);
		return A;
	}
	vector<int> MUL(vector<vector<int>> vc) {
		vector<vector<int>> tmp;
		while(vc.size()>1) {
			tmp.clear();
			ffor(i,1,vc.size()/2) tmp.push_back(mul(vc[i*2-2],vc[i*2-1]));
			if(vc.size()&1) tmp.push_back(vc[vc.size()-1]);
			vc=tmp;
		}
		return vc[0];
	}
};
int n,dp[MAXN][2],tp[MAXN],psl[MAXN];
vector<pair<int,int>> G[MAXN];
string S;
void dfs(int u,int f) {
	vector<vector<int>> vc;
	for(auto pr:G[u]) {
		int v=pr.first,id=pr.second;
		if(v==f) continue ;
		psl[v]=id,dfs(v,u);
		if(id) vc.push_back({0,dp[v][0],dp[v][1]});
		else vc.push_back({dp[v][1],dp[v][0],0});
	}
	if(tp[u]) vc.push_back({1,1,0});
	else vc.push_back({0,1,1});
	vector<int> rs=POLY::MUL(vc);
	dp[u][0]=rs[G[u].size()+!f];
	if(u==1) cout<<(dp[u][0]+MOD)%MOD;
	else if(psl[u]) dp[u][1]=rs[G[u].size()+1];
	else dp[u][1]=rs[G[u].size()-1];
	return ;
}
signed main() {
//	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>S,S="&"+S;
	ffor(i,1,n) if(S[i]=='S') tp[i]=1; else tp[i]=0;
	ffor(i,1,n-1) {
		int u,v;
		cin>>u>>v,G[u].push_back({v,1}),G[v].push_back({u,0});	
	}
	dfs(1,0);
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 21000kb

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: 2ms
memory: 20680kb

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: 19992kb

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: 0ms
memory: 20552kb

input:

2
FS
1 2

output:

1

result:

ok 1 number(s): "1"

Test #5:

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

input:

3
FFF
3 1
3 2

output:

1

result:

ok 1 number(s): "1"

Test #6:

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

input:

4
FFFF
1 2
4 2
2 3

output:

1

result:

ok 1 number(s): "1"

Test #7:

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

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: 3ms
memory: 20984kb

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
Runtime Error

input:

199995
FSSFFFSSSFSFFSSSFSSSSSFSFSSSFSFFSSFSFSFFFSSSFSSFSFFSFFFFSSFFSSSFFSFSFFFFFFFFFFFFFSSSFSSFFFSSSFSFSSSFFFSFFSFSSSSFSFSFSFSSFFSFSFFSFFSSFSSSFSFFSSSFFSFFFSFFSFSFSFSFSSSFSSSSFFSSFFFFFSFSSSFFSSSSSSSSFFFSFSFFSSSFSFFFFFSFFFFSSSSSSSFFFSFFSFSSSFSFSFFFFSFSSFSSFFFSSFFFSSFSFFFSSSFSFSSFFSFSFFSFFSSFSFSSSSFFF...

output:


result: