QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#461702 | #8836. Highway Hoax | Purslane | RE | 3ms | 21000kb | C++14 | 2.3kb | 2024-07-02 23:12:53 | 2024-07-02 23:12:53 |
Judging History
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...