QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#572217 | #8836. Highway Hoax | ATM12345 | TL | 6ms | 32432kb | C++17 | 3.4kb | 2024-09-18 13:01:29 | 2024-09-18 13:01:36 |
Judging History
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...